Glide — 緩存基礎(chǔ)
原文:Caching Basics
作者:Norman Peitek
翻譯:Dexter0218
我們學(xué)習(xí)完了加載、顯示和處理圖片,我們將會向前推進(jìn)學(xué)習(xí)優(yōu)化處理。一個成功的高效的圖片加載的基本功能是緩存。這篇文章將學(xué)習(xí)Glide中的緩存的基礎(chǔ)知識。
Glide 系列概覽
- 入門簡介
- 高級加載
- 適配器(ListView, GridView)
- 占位圖& 淡入淡出動畫
- 圖片大小 & 縮放
- 播放GIF & 視頻
- 緩存基礎(chǔ)
- 請求優(yōu)先級
- 縮略圖
- 回調(diào):定制view中使用SimpleTarget和ViewTarget
- 通知欄和桌面小控件的圖片加載
- 異常: 調(diào)試和報錯處理
- 自定義變換
- 用animate()定制動畫
- 整合網(wǎng)絡(luò)協(xié)議棧
- 用Modules定制Glide
- Glide Module 案例: 接受自簽名HTTPS證書
- Glide Module 案例: 自定義緩存
- Glide Module 案例: 通過加載自定義大小圖片優(yōu)化
- 動態(tài)使用 Model Loaders
- 如何旋轉(zhuǎn)圖片
- 系列綜述
緩存基礎(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)先級。