三方圖片加載框架glide Picasso fresco龙考,三級緩存

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

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

首先:

Glide加載的圖片沒有Picasso那么平滑

Picasso的內(nèi)存開銷遠(yuǎn)大于Glide淤齐,Picasso是加載了全尺寸的圖片到內(nèi)存,然后讓GPU來實(shí)時(shí)重繪大小袜匿。而Glide加載的大小和ImageView的大小是一致的床玻,因此更小,雖然內(nèi)存開銷差距不大沉帮,但是在這個(gè)問題上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è)尺寸的也緩存起來

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

對我而言荚守,我更喜歡Glide,因?yàn)樗h(yuǎn)比Picasso快练般,雖然需要更大的空間來緩存

Glide 簡介

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

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

雖然Glide 的主要目標(biāo)是讓任何形式的圖片列表的滾動(dòng)盡可能地變得更快甫男、更平滑,但實(shí)際上验烧,Glide幾乎能滿足你對遠(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);
//通過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);

跳過緩存

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簡介

依賴方面端幼,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加載圖片過多會(huì)導(dǎo)致圖片無法顯示庭呜,

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

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

緩存機(jī)制

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

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

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

其中內(nèi)存緩存和硬盤緩存對應(yīng)的類分別是LruCache和DiskLruCache。Android在Android 3.1加入了LruCache緩存類熙掺,其中維護(hù)著一個(gè)LinkedHashMap未斑。當(dāng)我們的APP中想要加載某張圖片時(shí)躺盛,先去LruCache中尋找圖片枢析,如果LruCache中有末誓,則直接取出來使用留潦,如果LruCache中沒有,則去文件系統(tǒng)中尋找戚扳,如果有則取出來使用竿滨,同時(shí)將圖片添加到LruCache中队他,如果沒有董瞻,則連接網(wǎng)絡(luò)從網(wǎng)上下載圖片寞蚌。圖片下載完成后,將圖片通過DiskLruCache緩存到本地钠糊,然后放到LruCache中挟秤。

Glide緩存

Glide雖然只有內(nèi)存和磁盤緩存,在性能上比不上Fresco抄伍;但他也有另外的優(yōu)點(diǎn)艘刚, Fresco緩存的時(shí)候,只會(huì)緩存原始圖像截珍,而Glide則會(huì)根據(jù)ImageView控件尺寸獲得對應(yīng)的大小的bitmap來展示攀甚,從而緩存也可以針對不同的對象:原始圖像(source),結(jié)果圖像(result); 可以通過.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)岗喉, 三級緩存秋度,分別是 Bitmap緩存,未解碼圖片緩存沈堡, 文件緩存。
這里提一點(diǎn)Bitmap緩存:在5.0以下系統(tǒng)燕雁,Bitmap緩存位于ashmem诞丽,這樣Bitmap對象的創(chuàng)建和釋放將不會(huì)引發(fā)GC鲸拥,更少的GC會(huì)使你的APP運(yùn)行得更加流暢。5.0及其以上系統(tǒng)僧免,相比之下刑赶,內(nèi)存管理有了很大改進(jìn),所以Bitmap緩存直接位于Java的heap上懂衩。
另外撞叨,磁盤緩存還可以通過代碼來設(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簡介:

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

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

glide加載圖片:http://www.reibang.com/p/2edd1767d66b

Fresco簡介:

項(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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浊洞,隨后出現(xiàn)的幾起案子牵敷,更是在濱河造成了極大的恐慌,老刑警劉巖法希,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枷餐,死亡現(xiàn)場離奇詭異,居然都是意外死亡苫亦,警方通過查閱死者的電腦和手機(jī)毛肋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屋剑,“玉大人润匙,你說我怎么就攤上這事“ω遥” “怎么了孕讳?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肄鸽。 經(jīng)常有香客問我卫病,道長,這世上最難降的妖魔是什么典徘? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任蟀苛,我火速辦了婚禮,結(jié)果婚禮上逮诲,老公的妹妹穿的比我還像新娘帜平。我一直安慰自己,他們只是感情好梅鹦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布裆甩。 她就那樣靜靜地躺著,像睡著了一般齐唆。 火紅的嫁衣襯著肌膚如雪嗤栓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音茉帅,去河邊找鬼叨叙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堪澎,可吹牛的內(nèi)容都是我干的擂错。 我是一名探鬼主播樱蛤,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼钮呀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昨凡?” 一聲冷哼從身側(cè)響起爽醋,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎土匀,沒想到半個(gè)月后子房,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡就轧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年证杭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妒御。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡解愤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乎莉,到底是詐尸還是另有隱情送讲,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布惋啃,位于F島的核電站哼鬓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏边灭。R本人自食惡果不足惜异希,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绒瘦。 院中可真熱鬧称簿,春花似錦、人聲如沸惰帽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽该酗。三九已至授药,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悔叽。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工航邢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骄蝇。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像操骡,于是被迫代替她去往敵國和親九火。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容