Glide入門教程——7. 緩存基礎(chǔ)

Glide — 緩存基礎(chǔ)

原文:Caching Basics
作者:Norman Peitek
翻譯:Dexter0218

我們學(xué)習(xí)完了加載、顯示和處理圖片,我們將會(huì)向前推進(jìn)學(xué)習(xí)優(yōu)化處理。一個(gè)成功的高效的圖片加載的基本功能是緩存。這篇文章將學(xué)習(xí)Glide中的緩存的基礎(chǔ)知識(shí)。

Glide 系列概覽

  1. 入門簡(jiǎn)介
  2. 高級(jí)加載
  3. 適配器(ListView, GridView)
  4. 占位圖& 淡入淡出動(dòng)畫
  5. 圖片大小 & 縮放
  6. 播放GIF & 視頻
  7. 緩存基礎(chǔ)
  8. 請(qǐng)求優(yōu)先級(jí)
  9. 縮略圖
  10. 回調(diào):定制view中使用SimpleTarget和ViewTarget
  11. 通知欄和桌面小控件的圖片加載
  12. 異常: 調(diào)試和報(bào)錯(cuò)處理
  13. 自定義變換
  14. 用animate()定制動(dòng)畫
  15. 整合網(wǎng)絡(luò)協(xié)議棧
  16. 用Modules定制Glide
  17. Glide Module 案例: 接受自簽名HTTPS證書
  18. Glide Module 案例: 自定義緩存
  19. Glide Module 案例: 通過加載自定義大小圖片優(yōu)化
  20. 動(dòng)態(tài)使用 Model Loaders
  21. 如何旋轉(zhuǎn)圖片
  22. 系列綜述

緩存基礎(chǔ)

Android應(yīng)用中一個(gè)較好的圖片的處理加載,會(huì)最小化網(wǎng)絡(luò)請(qǐng)求的消耗。Glide也是一樣,默認(rèn)使用內(nèi)存和磁盤緩存來避免不必要的網(wǎng)絡(luò)請(qǐng)求。我們將在后續(xù)的文章中詳細(xì)介紹這些細(xì)節(jié)。如果你等不及,可以去瀏覽一下關(guān)于這個(gè)主題的官方文檔。

目前,重要的處理方式是所有的圖片請(qǐng)求都會(huì)被緩存在內(nèi)存和磁盤上。大多數(shù)情況下,緩存是一個(gè)非常有用的東西,但在一些特殊的情況下并不是很明智。在下一節(jié)中,我們會(huì)介紹如何為單獨(dú)的請(qǐng)求調(diào)整Glide的緩存方式。

使用緩存的策略

如果你在前面用Glide用的很溜,你可能注意到你并不需要額外自己激活緩存。Glide本身自帶緩存。然而,如果你的圖片變化的非??欤阈枰苊庖恍┚彺?。

Glide提供了一些方法去避免內(nèi)存緩存和磁盤緩存。我們先看看內(nèi)存緩存。

內(nèi)存緩存

我們通過一個(gè)非常簡(jiǎn)單的請(qǐng)求:從網(wǎng)絡(luò)加載一個(gè)圖片到ImageView:

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .skipMemoryCache( true )
    .into( imageViewInternet );

你已經(jīng)注意到我們調(diào)用了.skipMemoryCache( true )去特意告訴Glide跳過內(nèi)存緩存。這意味著Glide不會(huì)把這個(gè)圖片緩存到內(nèi)存里。重要是,這個(gè)只影響內(nèi)存緩存!Glide為了避免以后的網(wǎng)絡(luò)請(qǐng)求,仍然會(huì)緩存到磁盤。

由于Glide默認(rèn)會(huì)將所有的圖片資源緩存到內(nèi)存中,因此,沒有必要手動(dòng)調(diào)用.skipMemoryCache( false )了。

提示:注意到現(xiàn)實(shí)情況,如果你要對(duì)同一個(gè)URL做一個(gè)初始化的請(qǐng)求,第一次沒使用.skipMemoryCache( true ),然后第二次使用了,將會(huì)獲取緩存在內(nèi)存中的資源。當(dāng)你調(diào)整緩存行為的時(shí)候,確保請(qǐng)求的都是指向同一個(gè)資源,

跳過磁盤緩存

如上面所講到的,即使你關(guān)閉了內(nèi)存緩存,所請(qǐng)求的圖片仍然會(huì)被保存在設(shè)備的磁盤存儲(chǔ)上。如果你有一張不段變化的圖片,但是都是用的同一個(gè)URL,你可能需要禁止磁盤緩存了。

你可以用.diskCacheStrategy()方法改變Glide的行為。不同于.skipMemoryCache()方法,它將需要從枚舉型變量中選擇一個(gè),而不是一個(gè)簡(jiǎn)單的boolean。如果你想要禁止請(qǐng)求的磁盤緩存,使用枚舉型變量DiskCacheStrategy.NONE作為參數(shù)。

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .diskCacheStrategy( DiskCacheStrategy.NONE )
    .into( imageViewInternet );

上面代碼里的圖片根本不會(huì)被保存在磁盤上。然后,默認(rèn)情況下它仍然使用內(nèi)存緩存!為了同時(shí)禁止掉兩個(gè)緩存,結(jié)合一下方法:

Glide  
    .with( context )
    .load( eatFoodyImages[0] )
    .diskCacheStrategy( DiskCacheStrategy.NONE )
    .skipMemoryCache( true )
    .into( imageViewInternet );

自定義磁盤緩存行為

我們之前提到的,Glide有很多磁盤緩存的策略。在我們展示這些選項(xiàng)前,你可能意識(shí)到Glide的磁盤緩存是相當(dāng)復(fù)雜的。例如,Picasso只緩存全尺寸圖片。Glide,會(huì)緩存原始,全尺寸的圖片和額外的小版本圖片。例如,如果你請(qǐng)求一個(gè)1000x1000像素的圖片,你的ImageView是500x500像素,Glide會(huì)保存兩個(gè)版本的圖片到緩存里。

現(xiàn)在,你應(yīng)該明白.diskCacheStrategy()中枚舉參數(shù)的意義了:

  • DiskCacheStrategy.NONE 啥也不緩存

  • DiskCacheStrategy.SOURCE 只緩存全尺寸圖. 上面例子里的1000x1000像素的圖片

  • DiskCacheStrategy.RESULT 只緩存最終降低分辨后用到的圖片

  • DiskCacheStrategy.ALL 緩存所有類型的圖片 (默認(rèn)行為)

作為最后一個(gè)例子,如果你有一個(gè)圖片你需要經(jīng)常處理它,會(huì)生成各種不同的版本的圖片,緩存它的原始的分辨率圖片才有意義。這樣,我們使用DiskCacheStrategy.SOURCE去告訴Glide只緩存原始版本:

Glide  
    .with( context )
    .load( eatFoodyImages[2] )
    .diskCacheStrategy( DiskCacheStrategy.SOURCE )
    .into( imageViewFile );

單張圖片的無效緩存

由于Glide緩存一張圖片的多個(gè)版本分辨圖片,并不好輕易從緩存中刪除一個(gè)文件,你需要去找到所有這個(gè)圖片可能有關(guān)系的緩存。這是一個(gè)相當(dāng)復(fù)雜的處理,官方wiki在無效緩存上的指導(dǎo)非常棒。

展望

在這篇文章中,你已經(jīng)學(xué)會(huì)了Glide的圖片緩存工作是如何進(jìn)行的,并且你也能夠分辨哪個(gè)緩存方式是你需要的。后續(xù)的文章中,我們將圍繞更多的優(yōu)化中。
下一篇文章,我們將會(huì)學(xué)習(xí)另一個(gè)關(guān)于用戶體驗(yàn)的關(guān)鍵部分,圖片請(qǐng)求的優(yōu)先級(jí)。

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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