Glide入門教程——7. 緩存基礎

Glide — 緩存基礎

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

我們學習完了加載、顯示和處理圖片,我們將會向前推進學習優化處理。一個成功的高效的圖片加載的基本功能是緩存。這篇文章將學習Glide中的緩存的基礎知識。

Glide 系列概覽

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

緩存基礎

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的圖片緩存工作是如何進行的,并且你也能夠分辨哪個緩存方式是你需要的。后續的文章中,我們將圍繞更多的優化中。
下一篇文章,我們將會學習另一個關于用戶體驗的關鍵部分,圖片請求的優先級。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容