問(wèn)題
使用glide加載圖片,glide有緩存,分為內(nèi)存緩存和磁盤緩存,可以通過(guò)diskCacheStrategy設(shè)置不同的緩存策略。具體可以看官方文檔(我使用的是glideV4 國(guó)內(nèi)的介紹還比較少)。但是對(duì)于指定的url的圖片,會(huì)出現(xiàn)服務(wù)器端的圖片已經(jīng)改變,但是本地加載的時(shí)候,glide發(fā)現(xiàn)有緩存,不會(huì)重新從服務(wù)器加載,導(dǎo)致一直顯示老的圖片。
解決
如果將
diskCacheStrategy設(shè)置為NONE,內(nèi)存緩存依然存在??梢栽O(shè)置skipMemoryCache(true),這樣每次加載都會(huì)從服務(wù)器重新加載。但是這樣耗費(fèi)流量,加重服務(wù)器負(fù)擔(dān)。不好。-
翻閱官方文檔發(fā)現(xiàn)glide有個(gè)
signature,就是為了解決這個(gè)問(wèn)題。因?yàn)間lide緩存是采<K, V>鍵值對(duì)存儲(chǔ),如果加載一個(gè)url的圖片,K就是url,url不變,那么緩存V也不會(huì)變。signature的作用就是可以在K上附加一寫Key,也就是我們可以在加載圖片的時(shí)候,存儲(chǔ)一個(gè)表明當(dāng)前版本的時(shí)間戳,當(dāng)更新時(shí),改變時(shí)間戳,時(shí)間戳改變也就是K改變,那么就會(huì)重新加載圖片。具體實(shí)現(xiàn)如下:
加載圖片,根據(jù)sp時(shí)間戳添加
signature:GlideApp.with(view.getContext()) .load(AppConstants.URL_USER_HEAD + uid) .signature(new ObjectKey(SPUtils.getInstance(AppConstants.SP_NAME_USER).getString("head_signature", ""))) .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) .placeholder(R.drawable.user_default_head) .error(R.drawable.user_default_head) .into(view);更新圖片時(shí),同時(shí)更新sp的時(shí)間戳:
SPUtils.getInstance(AppConstants.SP_NAME_USER) .put("head_signature",String.valueOf(System.currentTimeMillis()));這里有個(gè)不知道是不是問(wèn)題的問(wèn)題,每次加載都要讀取sp,可能會(huì)有影響。
-
注意官方文檔有一句話
Urls - Although the best way to invalidate urls is to make sure the server changes the url and updates the client when the content at the url changes, you can also use ObjectKey to mix in arbitrary metadata (such as a version number) instead.
也就是說(shuō)最好的方式就是讓服務(wù)器加一個(gè)時(shí)間戳,可是這樣實(shí)現(xiàn)起來(lái)可能就不是很簡(jiǎn)單。暫時(shí)沒(méi)有嘗試。嘗試了再來(lái)補(bǔ)充。先記下了。