記憶體快取和硬碟快取
由於工作中經常要處理圖片的載入快取的問題,所以需要理清系統快取的問題,否則經常會出現OOM問題。防止多圖OOM的解決技術是使用LruCache和DiskLruCache兩種技術。
一 LruCache記憶體快取
在Android中,這個LruCache類專門用做圖片快取處理的。當快取的圖片達到預先設定的值得時候,那麼近期使用次數最少的圖片就會被回收掉。
有些人可能還會使用軟引用這種方式。所謂“軟引用”就是隻要有足夠的記憶體,就一直保持物件,知道發現記憶體吃緊且沒有Strong Ref時才回收物件。但是現在已經不再推薦使用這種方式了,因為從Android2.3開始,垃圾回收器會更傾向於回收持有軟引用或弱引用的物件,這讓軟引用和弱引用變得更加不可靠。另外,Android3.0中,圖片的資料會儲存在本地的記憶體中,因而無法用一種可預見的方式將其釋放,這就有潛在的風險造成應用程式的記憶體溢位並奔潰。
如何使用LruCache呢?可以參考http://blog.csdn.net/gf771115/article/details/30269159文件。
二 DiskLruCache硬碟快取
LruCache只是管理了記憶體中圖片的儲存與釋放,如果圖片從記憶體中被移除,那麼又要重新載入一次圖片,這樣就會非常耗時。對此,google又提供了一套硬碟快取的方案——disklrucache。
在我們經常看到的應用,例如網易新聞、Twitter等,都是使用這種技術。可以檢視客戶端的包名,找到快取地址,
會發現有一個名字為journal的檔案,這個檔案時disklrucache的一個日誌檔案,看到這個檔案就說明改程式使用了這種技術。disklrucache中使用了一個redundantopcount變數來記錄使用者的操作次數,沒執行一次寫入、讀取或移除快取的操作,這個變數值都會加1,當變數值達到2000的時候就會觸發重構journal的事件,這是會自動把journal中的一些多餘的、不必要的記錄全部清除掉,保證journal檔案大小始終保持在一個合理的範圍內。
下載好了原始碼之後,只需要在專案中新建一個libcore.io包,然後將DiskLruCache.Java檔案複製到這個包中即可。
參考文件:http://blog.csdn.net/lwyygydx/article/details/40401211