三方圖片加載框架glide Picasso fresco,三級(jí)緩存

最常用的圖片加載框架是:Gilde,F(xiàn)resco,Picasso。Fresco是Facebook提供的開(kāi)源圖片加載庫(kù),它能夠從網(wǎng)絡(luò),本地存儲(chǔ)和Android資源文件中加載圖片,且具有三級(jí)緩存設(shè)計(jì)(2級(jí)內(nèi)存,1級(jí)文件)。

兩者的使用很相似,但是也有很大的區(qū)別:

首先:

Glide加載的圖片沒(méi)有Picasso那么平滑

Picasso的內(nèi)存開(kāi)銷遠(yuǎn)大于Glide,Picasso是加載了全尺寸的圖片到內(nèi)存,然后讓GPU來(lái)實(shí)時(shí)重繪大小。而Glide加載的大小和ImageView的大小是一致的,因此更小,雖然內(nèi)存開(kāi)銷差距不大,但是在這個(gè)問(wèn)題上Glide完勝Picasso。因?yàn)镚lide可以自動(dòng)計(jì)算出任意情況下的ImageView大小。

Picasso和Glide在磁盤緩存策略上有很大的不同。Picasso緩存的是全尺寸的,而Glide緩存的是跟ImageView尺寸相同的

嘗試將ImageView調(diào)整成不同大小,但不管大小如何Picasso只緩存一個(gè)全尺寸的。Glide則不同,它會(huì)為每種大小的ImageView緩存一次。盡管一張圖片已經(jīng)緩存了一次,但是假如你要在另外一個(gè)地方再次以不同尺寸顯示,需要重新下載,調(diào)整成新尺寸的大小,然后將這個(gè)尺寸的也緩存起來(lái)

Glide的這種方式優(yōu)點(diǎn)是加載顯示非???。而Picasso的方式則因?yàn)樾枰陲@示之前重新調(diào)整大小而導(dǎo)致一些延遲,即便你添加了這段代碼來(lái)讓

對(duì)我而言,我更喜歡Glide,因?yàn)樗h(yuǎn)比Picasso快,雖然需要更大的空間來(lái)緩存

Glide 簡(jiǎn)介

Glide是一個(gè)快速高效的Android圖片加載庫(kù),注重于平滑的滾動(dòng)。Glide提供了易用的API,高性能、可擴(kuò)展的圖片解碼管道(decode pipeline),以及自動(dòng)的資源池技術(shù)。

Glide 支持拉取,解碼和展示視頻快照,圖片,和GIF動(dòng)畫(huà)。Glide的Api是如此的靈活,開(kāi)發(fā)者甚至可以插入和替換成自己喜愛(ài)的任何網(wǎng)絡(luò)請(qǐng)求框架。
默認(rèn)情況下,Glide使用的是一個(gè)定制化的基于 HttpUrlConnection 的棧,但同時(shí)也提供了與 Google Volley 和 Square OkHttp 快速集成的工具庫(kù)。

雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動(dòng)盡可能地變得更快、更平滑,但實(shí)際上,Glide幾乎能滿足你對(duì)遠(yuǎn)程圖片的拉取/縮放/顯示的一切需求。

2,glide的使用

1、導(dǎo)入依賴

implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'

2、添加權(quán)限

<uses-permission android:name="android.permission.INTERNET"/>
<!--
Allows Glide to monitor connectivity status and restart failed requests 
if users go from a disconnected to a connected network state.
-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3、加載圖片
一般使用只加載圖片

Glide.with(fragment)
    .load(url)
    .into(imageView);

加載圓形圖片

//      .transform(new RoundedCorners(24))直接也可以
RequestOptions mRequestOptions = RequestOptions.circleCropTransform()//圓形方法
            .skipMemoryCache(true);//不做內(nèi)存緩存

    GlideApp.with(this)
            .load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
            .centerCrop()
            .apply(mRequestOptions)
            .placeholder(R.drawable.ic_launcher_background)//加載中顯示的圖片
            .error(R.drawable.ic_launcher_foreground)// 錯(cuò)誤后顯示的圖片
            .into(mImg);

加載圓角

//設(shè)置圖片圓角角度
RoundedCorners roundedCorners= new RoundedCorners(6);
//通過(guò)RequestOptions擴(kuò)展功能,override:采樣率,因?yàn)镮mageView就這么大,可以壓縮圖片,降低內(nèi)存消耗
RequestOptions options=RequestOptions.bitmapTransform(roundedCorners).override(300, 300);
 
GlideApp.with(this)
.load("https://ws1.sinaimg.cn/large/0065oQSqgy1fze94uew3jj30qo10cdka.jpg")
.apply(options)
.into(img);

3、Glide圖片緩存

磁盤緩存策略(Disk Cache Strategy)

Glide.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);

僅從緩存加載圖片

Glide.with(fragment)
  .load(url)
  .onlyRetrieveFromCache(true)
  .into(imageView);

跳過(guò)緩存

Glide.with(fragment)
  .load(url)
  .skipMemoryCache(true)
  .into(view);

清除緩存

// This method must be called on the main thread.
Glide.get(context).clearMemory();
new AsyncTask<Void, Void, Void> {
  @Override
  protected Void doInBackground(Void... params) {
    // This method must be called on a background thread.
    Glide.get(applicationContext).clearDiskCache();
    return null;
  }
}

Fresco簡(jiǎn)介

依賴方面,Picasso是獨(dú)立依賴,配置的時(shí)候直接在gradle腳本中添加compile 'com.squareup.picasso:picasso:x.x.x'

1、添加依賴

implementation 'com.facebook.fresco:fresco:1.13.0'

2、添加權(quán)限

<uses-permission android:name="android.permission.INTERNET" />

3、基本用法

// 布局文件
<com.facebook.drawee.view.SimpleDraweeView
    app:placeholderImage="@drawable/image_reading_girl"
    android:id="@+id/draweeView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true" />
// 初始化
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

// 加載圖片
SimpleDraweeView draweeView = this.findViewById(R.id.draweeView);
Uri uri = Uri.parse("https://www.baidu.com/img/bd_logo1.png");
draweeView.setImageURI(uri);

總結(jié)一下

Fresco加載圖片過(guò)多會(huì)導(dǎo)致圖片無(wú)法顯示,

Glide兩個(gè)控件同時(shí)請(qǐng)求同一個(gè)URL,網(wǎng)絡(luò)請(qǐng)求是兩次,
Imageloader一次加載圖片也會(huì)請(qǐng)求兩次URL,不知道是不是設(shè)置的問(wèn)題,

Picasso完美的解決了以上所有問(wèn)題。雖然這個(gè)框架逐漸被Fresco和Glide代替了

緩存機(jī)制

內(nèi)存緩存,讀取速度最快。

硬盤緩存(文件緩存),讀取速度比內(nèi)存緩存稍慢。

網(wǎng)絡(luò)緩存,讀取速度最慢。

其中內(nèi)存緩存和硬盤緩存對(duì)應(yīng)的類分別是LruCache和DiskLruCache。Android在Android 3.1加入了LruCache緩存類,其中維護(hù)著一個(gè)LinkedHashMap。當(dāng)我們的APP中想要加載某張圖片時(shí),先去LruCache中尋找圖片,如果LruCache中有,則直接取出來(lái)使用,如果LruCache中沒(méi)有,則去文件系統(tǒng)中尋找,如果有則取出來(lái)使用,同時(shí)將圖片添加到LruCache中,如果沒(méi)有,則連接網(wǎng)絡(luò)從網(wǎng)上下載圖片。圖片下載完成后,將圖片通過(guò)DiskLruCache緩存到本地,然后放到LruCache中。

Glide緩存

Glide雖然只有內(nèi)存和磁盤緩存,在性能上比不上Fresco;但他也有另外的優(yōu)點(diǎn), Fresco緩存的時(shí)候,只會(huì)緩存原始圖像,而Glide則會(huì)根據(jù)ImageView控件尺寸獲得對(duì)應(yīng)的大小的bitmap來(lái)展示,從而緩存也可以針對(duì)不同的對(duì)象:原始圖像(source),結(jié)果圖像(result); 可以通過(guò).diskCacheStrategy()方法設(shè)置:

public enum DiskCacheStrategy {    
      /** Caches with both {@link #SOURCE} and {@link #RESULT}. */    
      ALL(true, true),    
      /** Saves no data to cache. */    
      NONE(false, false),    
      /** Saves just the original data to cache. */    
      SOURCE(true, false),    
      /** Saves the media item after all transformations to cache. */    
      RESULT(false, true);
}

Fresco緩存

Fresco緩存也是一大亮點(diǎn), 三級(jí)緩存,分別是 Bitmap緩存,未解碼圖片緩存, 文件緩存。
這里提一點(diǎn)Bitmap緩存:在5.0以下系統(tǒng),Bitmap緩存位于ashmem,這樣Bitmap對(duì)象的創(chuàng)建和釋放將不會(huì)引發(fā)GC,更少的GC會(huì)使你的APP運(yùn)行得更加流暢。5.0及其以上系統(tǒng),相比之下,內(nèi)存管理有了很大改進(jìn),所以Bitmap緩存直接位于Java的heap上。
另外,磁盤緩存還可以通過(guò)代碼來(lái)設(shè)置不同手機(jī)的緩存容量:

String diskCacheUniqueName){
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
        .setMaxCacheSize(DISK_CACHE_SIZE_HIGH)
        .setMaxCacheSizeOnLowDiskSpace(DISK_CACHE_SIZE_LOW)
        .setMaxCacheSizeOnVeryLowDiskSpace(DISK_CACHE_SIZE_VERY_LOW)
        .build();

ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
        .setMainDiskCacheConfig(diskCacheConfig)
        .build();
Fresco.initialize(context, config);

參考鏈接:

Glide簡(jiǎn)介:

項(xiàng)目地址:https://github.com/bumptech/glide

官方文檔:https://muyangmin.github.io/glide-docs-cn/

glide加載圖片:http://m.itdecent.cn/p/2edd1767d66b

Fresco簡(jiǎn)介:

項(xiàng)目地址:https://github.com/facebook/fresco

官方文檔:https://frescolib.org/

緩存:https://blog.csdn.net/csdn_aiyang/article/details/80683479

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容