1. 程式人生 > >關於Android開發中圖片的三級快取機制

關於Android開發中圖片的三級快取機制

1.Android應用中聯網載入並顯示圖片時,為了使用者體驗和節省流量,一定用到圖片的快取。
2.關於三級快取的理解:記憶體快取(強引用儲存)、記憶體快取(軟引用快取)、記憶體快取(弱引用快取)、檔案快取(就是將圖片儲存為本地檔案),由此組成三級快取。
3.關於JAVA中的物件引用,分為:強、軟、弱、虛。
4.關於JAVA的強引用與軟引用:
(1)強引用:JVM不會回收任何具有強引用的物件,記憶體空間不足時,將丟擲OOM異常;
(2)軟引用:在記憶體不足時,JVM將會回收掉具有軟引用的物件,從而滿足程式執行的需求,以此避免出現OOM導致的程式崩潰。
5.關於LruCache類的理解:

這個類其實就是一個雜湊表,儲存鍵值對。
值得注意的是:LruCache內部儲存的圖片記憶體數量超過上限以後,將採用LRU演算法刪除部分圖片。LRU:Least-Recently-Used,最近最少使用演算法。
Cache儲存一個強引用來限制內容數量,每當Item被訪問的時候,此Item就會移動到佇列的頭部。當cache已滿的時候加入新的item時,在佇列尾部的item會被回收。
6.記憶體快取部分:
(1)強引用儲存區:
LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>();
(2)軟引用儲存區:
HashMap<String,Bitmap> softBitmapCache = new HashMap<String,SoftReference<Bitmap>>();
7.檔案快取部分:
(1)獲取本地儲存的檔名:採用MD5演算法,建立URL與檔名的唯一對映關係。將從網路下載的圖片檔案,儲存為本地檔案,命名為MD5轉換的檔名。
(2)獲取本地儲存的路徑:優先儲存SD卡外部儲存,找不到儲存卡時,可以儲存到內部儲存。
8.從檔案快取中獲取圖片的流程:
強引用儲存區---->軟引用儲存區---->檔案儲存----->網路獲取---->顯示UI
9.問題:在記憶體快取中獲取圖片時,為什麼先在強引用儲存區查詢,再去軟引用儲存區查詢?
答:強引用儲存區儲存的圖片,有上限,超過上限將會採用LRU演算法進行刪除;軟引用儲存區的圖片,在記憶體不足時,JVM將會自動刪除部分圖片。

10.不同的API級別,計算Bitmap物件的記憶體佔用大小的程式碼示例:
11.在記憶體快取中取出Bitmap物件程式碼示例:
12.第一次獲取在網上獲取圖片檔案時,存入三級快取中的程式碼示例: