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

Glide — 緩存基礎(chǔ)

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

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

Glide 系列概覽

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

緩存基礎(chǔ)

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

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

使用緩存的策略

如果你在前面用Glide用的很溜,你可能注意到你并不需要額外自己激活緩存。Glide本身自帶緩存。然而,如果你的圖片變化的非常快,你需要避免一些緩存。

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

內(nèi)存緩存

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

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

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

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

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

跳過磁盤緩存

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

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

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

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

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

自定義磁盤緩存行為

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

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

  • DiskCacheStrategy.NONE 啥也不緩存

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

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

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

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

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

單張圖片的無效緩存

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

展望

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

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

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

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