標籤:relative ext java sid copy important gif 硬碟 init
[轉] 原文
Android Glide資料更新及記憶體緩衝、硬碟緩衝清理
Android的Glide在載入圖片時候內部預設使用了緩衝機制,Glide的緩衝機制分為兩級,第一級是記憶體緩衝,然後第二級是硬碟緩衝。緩衝的過程首先是在記憶體中緩衝,然後將載入的圖片資源緩衝到硬碟,這樣就可以在隨後的再次載入中使用緩衝了,Glide使用緩衝時候首先要檢查記憶體這一層級是否緩衝了相應的緩衝,如果有,則直接使用,如果沒有,則深入到硬碟緩衝中檢查是否有,如果有,則載入之,如果到這一步驟還沒有,那麼就只能作為一個全新的資源載入了。
從這個過程中,Glide使用緩衝無疑大大提高了上層代碼的效能,但是,有些情況下,這種緩衝策略則可能並不適用。比如,APP中有一個頭像,該頭像是從一個固定連結http://xxx.xxx.jpg讀取,假設代碼第一次讀取後,緩衝到了本地。然而,幾分鐘後該圖片更新了,但是連結仍然是http://xxx.xxx.jpg。隨後,假設,三小時或三天或三十天后同樣的連結http://xxx.xxx.jpg讀取,此時Glide載入時候檢查緩衝,發現針對http://xxx.xxx.jpg的資源已經緩衝,那麼Glide不再從伺服器讀取,而是直接載入本機快取使用,這樣就造成了Glide載入出來的圖片資源不是最新的。
總結:Glide的緩衝機制雖然提升了效能,但是如果針對固定資源路徑的請求,將導致請求得到的資源是緩衝的,這樣就不能保證最新。換句話說,如果給定資源地址下的資源的頻繁更新的,而資源地址是固定,則Glide此時的緩衝策略就顯得不太合適。
導致這種問題的原因有二:
一, Glide本身使用了緩衝。
二, Glide在緩衝資源使用<K,V>索引值對模型,如果每次都使用http://xxx.xxx.jpg這個URL,那麼鍵相同,意味著Glide匹配鍵時候,永遠可以從緩衝中返回鍵對應的值。
針對這個問題的解決方案:
解決方案1:
從Glide提供的緩衝索引值對<K,V>結構模型入手,重寫緩衝的<K,V>索引值策略,就可以避免相同資源地址下資源更新問題了,但是這種方案實現比較複雜,也無十分必要。不推薦,除非必需。
解決方案2:
Glide.get(this).clearMemory();
清理記憶體中的緩衝。
Glide.get(this).clearDiskCache();
清理硬碟中的緩衝。
以上兩個方法清除全域的記憶體緩衝和硬碟緩衝,雖然可以一勞永逸的解決緩衝導致的資源陳舊問題,但是將嚴重影響全域效能,所以慎用,除非是在APP整體要做全新的開始或者恢複原始狀態,否則盡量避免使用。
解決方案3(推薦):
代碼形如:
[java] view plain copy
- ImageView image= (ImageView) findViewById(R.id.image);
- Glide.with(this).load("http://avatar.csdn.net/9/7/A/1_zhangphil.jpg")
- .skipMemoryCache(true)
- .diskCacheStrategy(DiskCacheStrategy.NONE)
- .into(image);
關鍵代碼:skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
skipMemoryCache(true) ,跳過記憶體緩衝。
diskCacheStrategy(DiskCacheStrategy.NONE) ,不要在disk硬碟中緩衝。
這兩個函數同時聯合使用,使得Glide針對這一次的資源載入放棄記憶體緩衝和硬碟緩衝,相當於一次全新的請求。這樣就迫使Glide從給定的資源地址發起全新的資料載入,而非從舊有的緩衝中取緩衝使用。
附錄:
1,《Android圖片載入與緩衝開源架構:Android Glide》連結:http://blog.csdn.net/zhangphil/article/details/45535693
2,《Android Glide載入圖片時轉換為圓形、圓角、毛玻璃等圖片效果》連結:http://blog.csdn.net/zhangphil/article/details/52806374
Android Glide資料更新及記憶體緩衝、硬碟緩衝清理