1. 程式人生 > >Glide載入相同URL時由於快取無法更新圖片的問題

Glide載入相同URL時由於快取無法更新圖片的問題

在使用Glide載入圖片時,如果設定了快取,那麼無論圖片是否有了更新,只要URL不變,那麼就會使用記憶體快取或者磁碟快取的圖片,導致加載出來的圖片沒有更新的問題,因此有兩種解決方法:

1.如果是本地圖片,可以採取取消快取的方式,這樣是比較簡單的操作:

Glide.load(url)
  .skipMemoryCache(true) // 不使用記憶體快取
  .diskCacheStrategy(DiskCacheStrategy.NONE) // 不使用磁碟快取
  .into(imageView);

2.無論本地圖片網路圖片,都可以使用另一個方法,就是使用Glide的方法.signature(Key signature),通過建立一個簽名,然後在圖片更新的時候,更改簽名,達到重新載入的效果。該簽名可以是個String,可以是圖片更新的時間,如:

// 這裡只是說明一下如何實現,具體的邏輯操作和封裝需要根據需求自己編寫程式碼,
// 比如可以將最新一次的更新儲存在SharedPreferences中,每次載入時跟Preferences中儲存的數值進行對比
String updateTime = String.valueOf(System.currentTimeMillis()); // 在需要重新獲取更新的圖片時呼叫
Glide.load(url)
  .signature(new StringSignature(updateTime))
  .into(image);

正常情況這樣就可以解決問題,那麼問題來了。。。

我用的是第二種方法解決的,由於我的Glide是4.0.

根本找不到StringSignature,What??? 根本搞不清楚狀況,經過一番折騰(各種百度。。。)

終於找到原因:

舊版本Glide.signature()方法形參支援使用StringSignature。但在Glide 4.0裡面這個方法不僅被移到RequestOptions中,而且形參改為Key

接下里就是解決它了:

1.Key

不過Key是一個介面,需要實現抽象方法

void updateDiskCacheKey(MessageDigest messageDigest);

2.ObjectKey

Key還有一個使用相對方便的子類ObjectKey,構造方法以Object

為引數,下面是實際用法:

public static RequestOptions userAvatarOptions = new RequestOptions()
            .placeholder(R.drawable.def_avatar)
            .error(R.drawable.def_avatar)
            .signature(new ObjectKey(System.currentTimeMillis()))
            .encodeQuality(70);

程式碼中建立了一個ObjectKey例項,並把當前時間戳整形值作為引數。

好了,到此問題就解決完畢了!!!