Glide — 緩存基礎
原文:Caching Basics
作者:Norman Peitek
翻譯:Dexter0218
我們學習完了加載、顯示和處理圖片,我們將會向前推進學習優化處理。一個成功的高效的圖片加載的基本功能是緩存。這篇文章將學習Glide中的緩存的基礎知識。
Glide 系列概覽
- 入門簡介
- 高級加載
- 適配器(ListView, GridView)
- 占位圖& 淡入淡出動畫
- 圖片大小 & 縮放
- 播放GIF & 視頻
- 緩存基礎
- 請求優先級
- 縮略圖
- 回調:定制view中使用SimpleTarget和ViewTarget
- 通知欄和桌面小控件的圖片加載
- 異常: 調試和報錯處理
- 自定義變換
- 用animate()定制動畫
- 整合網絡協議棧
- 用Modules定制Glide
- Glide Module 案例: 接受自簽名HTTPS證書
- Glide Module 案例: 自定義緩存
- Glide Module 案例: 通過加載自定義大小圖片優化
- 動態使用 Model Loaders
- 如何旋轉圖片
- 系列綜述
緩存基礎
Android應用中一個較好的圖片的處理加載,會最小化網絡請求的消耗。Glide也是一樣,默認使用內存和磁盤緩存來避免不必要的網絡請求。我們將在后續的文章中詳細介紹這些細節。如果你等不及,可以去瀏覽一下關于這個主題的官方文檔。
目前,重要的處理方式是所有的圖片請求都會被緩存在內存和磁盤上。大多數情況下,緩存是一個非常有用的東西,但在一些特殊的情況下并不是很明智。在下一節中,我們會介紹如何為單獨的請求調整Glide的緩存方式。
使用緩存的策略
如果你在前面用Glide用的很溜,你可能注意到你并不需要額外自己激活緩存。Glide本身自帶緩存。然而,如果你的圖片變化的非常快,你需要避免一些緩存。
Glide提供了一些方法去避免內存緩存和磁盤緩存。我們先看看內存緩存。
內存緩存
我們通過一個非常簡單的請求:從網絡加載一個圖片到ImageView:
Glide
.with( context )
.load( eatFoodyImages[0] )
.skipMemoryCache( true )
.into( imageViewInternet );
你已經注意到我們調用了.skipMemoryCache( true )去特意告訴Glide跳過內存緩存。這意味著Glide不會把這個圖片緩存到內存里。重要是,這個只影響內存緩存!Glide為了避免以后的網絡請求,仍然會緩存到磁盤。
由于Glide默認會將所有的圖片資源緩存到內存中,因此,沒有必要手動調用.skipMemoryCache( false )了。
提示:注意到現實情況,如果你要對同一個URL做一個初始化的請求,第一次沒使用.skipMemoryCache( true ),然后第二次使用了,將會獲取緩存在內存中的資源。當你調整緩存行為的時候,確保請求的都是指向同一個資源,
跳過磁盤緩存
如上面所講到的,即使你關閉了內存緩存,所請求的圖片仍然會被保存在設備的磁盤存儲上。如果你有一張不段變化的圖片,但是都是用的同一個URL,你可能需要禁止磁盤緩存了。
你可以用.diskCacheStrategy()方法改變Glide的行為。不同于.skipMemoryCache()方法,它將需要從枚舉型變量中選擇一個,而不是一個簡單的boolean。如果你想要禁止請求的磁盤緩存,使用枚舉型變量DiskCacheStrategy.NONE作為參數。
Glide
.with( context )
.load( eatFoodyImages[0] )
.diskCacheStrategy( DiskCacheStrategy.NONE )
.into( imageViewInternet );
上面代碼里的圖片根本不會被保存在磁盤上。然后,默認情況下它仍然使用內存緩存!為了同時禁止掉兩個緩存,結合一下方法:
Glide
.with( context )
.load( eatFoodyImages[0] )
.diskCacheStrategy( DiskCacheStrategy.NONE )
.skipMemoryCache( true )
.into( imageViewInternet );
自定義磁盤緩存行為
我們之前提到的,Glide有很多磁盤緩存的策略。在我們展示這些選項前,你可能意識到Glide的磁盤緩存是相當復雜的。例如,Picasso只緩存全尺寸圖片。Glide,會緩存原始,全尺寸的圖片和額外的小版本圖片。例如,如果你請求一個1000x1000像素的圖片,你的ImageView是500x500像素,Glide會保存兩個版本的圖片到緩存里。
現在,你應該明白.diskCacheStrategy()中枚舉參數的意義了:
DiskCacheStrategy.NONE 啥也不緩存
DiskCacheStrategy.SOURCE 只緩存全尺寸圖. 上面例子里的1000x1000像素的圖片
DiskCacheStrategy.RESULT 只緩存最終降低分辨后用到的圖片
DiskCacheStrategy.ALL 緩存所有類型的圖片 (默認行為)
作為最后一個例子,如果你有一個圖片你需要經常處理它,會生成各種不同的版本的圖片,緩存它的原始的分辨率圖片才有意義。這樣,我們使用DiskCacheStrategy.SOURCE去告訴Glide只緩存原始版本:
Glide
.with( context )
.load( eatFoodyImages[2] )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );
單張圖片的無效緩存
由于Glide緩存一張圖片的多個版本分辨圖片,并不好輕易從緩存中刪除一個文件,你需要去找到所有這個圖片可能有關系的緩存。這是一個相當復雜的處理,官方wiki在無效緩存上的指導非常棒。
展望
在這篇文章中,你已經學會了Glide的圖片緩存工作是如何進行的,并且你也能夠分辨哪個緩存方式是你需要的。后續的文章中,我們將圍繞更多的優化中。
下一篇文章,我們將會學習另一個關于用戶體驗的關鍵部分,圖片請求的優先級。