當我們看了加載,顯示和處理圖像后,我們將會繼續進行優化的進程。圖像成功和高效加載的一個很基礎的功能是緩存!在這篇博客中,我們將整理在 Glide 中的緩存基礎。
**緩存基礎?**
在 Android App 中必須去做的是一個很好的實現圖片加載組件,嘗試去減少網絡請求。Glide 在這里并沒有什么不同。Glide 通過使用默認的內存和磁環緩存去避免不必要的網絡請求。我們將在后面的博客中去詳細的查看實現細節。如果你等不到那個時候,通過瀏覽[官方文檔](https://github.com/bumptech/glide/wiki/Caching-and-Cache-Invalidation)這個話題。
目前最重要的是帶著所有的圖片請求放到內存和磁盤中。雖然緩存通常是很有用的,但在某些情況下,它可能不是像期待的行為那樣。在下一節中,我們會看看如何為單個請求改變 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) 方法,你后來又調用了 `.skipMemoryCache(true)` 這個方法,這個資源將會在內存中獲取緩存。當你想要去調整緩存行為時,確保對同一個資源調用的一致性。**
**跳過磁盤緩存**?
正如你上面這部分所了解到的,即使你關閉內存緩存,請求圖片將會仍然被存儲在設備的磁盤緩存中。如果你有一張圖片具有相同的 URL,但是變化很快,你可能想要連磁盤緩存也一起禁用。
你可以用 `.diskCacheStrategy()` 方法為 Glide 改變磁盤緩存的行為。不同的于 `.skipMemoryCache()` 方法,它需要一個枚舉而不是一個簡答的布爾值。如果你想要為一個請求禁用磁盤緩存。使用枚舉 `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](https://futurestud.io/blog/tag/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 );
~~~
**Outlook**?
在這篇博客中,你已經了解了 Glide 圖像緩存工作的基礎知識以及你如何根據你的需求去調整它的行為。在后面的博客中,我們會回頭來做更高級的優化。然而,這個博客開了個頭,給了你一個非常有效的方法去獲得最出色的 Glide 緩存行為。
下周,我們將看另一個對于用戶體驗來說極其重要的部分:對圖像的要求!
- 前言
- 一開始
- 二加載進階
- 三ListAdapter(ListView, GridView)
- 四占位符 和 漸現動畫
- 五圖片重設大小 和 縮放
- 六顯示 Gif 和 Video
- 七緩存基礎
- 八請求優先級
- 九縮略圖
- 十回調:SimpleTarget 和 ViewTarget 用于自定義視圖類
- 十一加載圖片到通知欄和應用小部件中
- 十二異常:調試和錯誤處理
- 十三自定義轉換
- 十四用 animate() 自定義動畫
- 十五集成網絡棧
- 十六用 Module 自定義
- 十七Module 實例:接受自簽名證書的 HTTPS
- 十八Module 實例:自定義緩存
- 十九Module 實例:用自定義尺寸優化加載的圖片
- 二十動態使用 Model Loader
- 二十一如何旋轉圖像
- 二十二系列綜述