Glide - 記憶體快取與磁碟快取

夏雨友人帳發表於2017-04-25

前言:

這一節我們將講到Glide的記憶體快取和磁碟快取

(網上流傳的比較廣的幾篇文章都是直接從是一篇譯文中拷貝過去的,那篇譯文在許多地方都翻譯錯誤了,其中很大的一個錯誤就是關於快取一塊的問題)

Glide 系列目錄

1.快取的資源

Glide的快取資源分為兩種:

  • 1.原圖(SOURCE) :原始圖片
  • 2.處理圖(RESULT) :經過壓縮和變形等處理後的圖片

2.記憶體快取策略(skipMemoryCache)

Glide預設是會在記憶體中快取處理圖(RESULT)的.

可以通過呼叫skipMemoryCache(true)來設定跳過記憶體快取

    //跳過記憶體快取
    Glide.with(this).load(mUrl).skipMemoryCache(true).into(mIv);複製程式碼

呼叫skipMemoryCache(false)沒有程式碼上的意義,因為Glide預設就是不跳過記憶體快取的,但是顯示呼叫這個方法,可以讓別人一目瞭然的知道你這次請求是會在記憶體中快取的,所以還是建議顯示呼叫一下這個方法來表明你的記憶體快取策略

3.磁碟快取策略(diskCacheStrategy)

Glide磁碟快取策略分為四種,預設的是RESULT(預設值這一點網上很多文章都寫錯了,但是這一點很重要):

  • 1.ALL:快取原圖(SOURCE)和處理圖(RESULT)

  • 2.NONE:什麼都不快取

  • 3.SOURCE:只快取原圖(SOURCE)

  • 4.RESULT:只快取處理圖(RESULT) ---預設值

4.組合策略

和其他三級快取一樣,Glide的快取讀取順序是 記憶體-->磁碟-->網路

需要注意的是Glide的記憶體快取和磁碟快取的配置相互沒有直接影響,所以可以同時進行配置

例:

1.記憶體不快取,磁碟快取快取所有圖片

 Glide.with(this).load(mUrl).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).into(mIv);複製程式碼

2.記憶體快取處理圖,磁碟快取原圖

 Glide.with(this).load(mUrl).skipMemoryCache(false).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(mIv);複製程式碼

5.快取大小及路徑

5.1記憶體快取最大空間

Glide的記憶體快取其實涉及到比較多的計算,這裡就介紹最重要的一個引數,就是記憶體快取最大空間

記憶體快取最大空間(maxSize)=每個程式可用的最大記憶體 * 0.4

(低配手機的話是: 每個程式可用的最大記憶體 * 0.33)

5.2磁碟快取大小

磁碟快取大小: 250 1024 1024(250MB)

/** 250 MB of cache. */
    int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;複製程式碼

5.3磁碟快取目錄

磁碟快取目錄: 專案/cache/image_manager_disk_cache

    String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";複製程式碼

6.清除快取

6.1清除所有快取

清除所有記憶體快取(需要在Ui執行緒操作)

 Glide.get(this).clearMemory();複製程式碼

清除所有磁碟快取(需要在子執行緒操作)

Glide.get(MainActivity.this).clearDiskCache();複製程式碼

注:在使用中的資源不會被清除

6.2清除單個快取

由於Glide可能會快取一張圖片的多個解析度的圖片,並且檔名是被雜湊過的,所以並不能很好的刪除單個資源的快取,以下是官方文件中的描述

Because File names are hashed keys, there is no good way to simply delete all of the cached files on disk that
correspond to a particular url or file path. The problem would be simpler if you were only ever allowed to load
or cache the original image, but since Glide also caches thumbnails and provides various transformations, each
of which will result in a new File in the cache, tracking down and deleting every cached version of an image 
is difficult.

In practice, the best way to invalidate a cache file is to change your identifier when the content changes 
(url, uri, file path etc).複製程式碼

熱門文章

相關文章