Glide載入相同URL時由於快取無法更新圖片的問題
阿新 • • 發佈:2018-12-21
在使用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
例項,並把當前時間戳整形值作為引數。
好了,到此問題就解決完畢了!!!