官方建議使用lrucache進行內存緩存。Lrucache底層實際是維護的一個linkedHashMap集合(他是hashmap的一個子類,可以保證存入和取出順序的集合,與hashmap不同的是他是一個雙向鏈表從Android2.3以后,系統GC操作更加頻繁,所以軟引用和弱引用的資源很容易被回收。Android的結構,內部會定義兩個屬性分別為before和after,用于記錄元素的位置;而haspmap是一個單向的鏈表結構),他有一個關鍵的方法就是在我們向lrucache中存儲元素的時候,會先去將該元素所占空間大小與lrucache中所有元素的所占空間求和,然后和我們設置的最大可用存儲內存進行比較,如果超過我們設置的最大值,就會將最近最少使用的元素刪除以騰挪空間,每當我們獲取元素時,會將原位置的元素進行刪除,然后重新在表頭將獲取的元素進行插入。
注意:DiskLruCache不是Google官方的,需要從github上下載放入工程中,在獲取DiskLruCache實例的時候,方法中有個參數是應用的版本號,這里注意當應用版本號改變時,DiskLruCache中的所有數據都會被清除。因為DiskLruCache認為,當應用版本號更新后,數據都應該重新從服務器獲取。DiskLruCache能否正常工作,主要依賴journal這個文件,所以我們要注意調用diskLrucache的flush方法,將內存中的操作同步到journal文件,但是注意,不要頻繁去同步操作,這樣會消耗大量的同步時間,所以我們一般在activity的onPause生命周期中去執行disklrucache的flush方法即可。
對于journal文件,其內部有一些信息我們是可以看懂的
DIRTY 每當我們調用edit方法的時候,回向journal寫入一條DIRTY記錄,因為我們不知道該操作是否能成功
CLEAN 當我們調用commit方法時,會像journal寫入一條CLEAN記錄,表示操作成功,并在該數據后面記錄該文件的大小。
REMOVE 但我們調用abort方法時,會向journal寫入一條REMOVE記錄,變化操作失敗
也就是說每一條DIRTY后面都有一條對應的CLEAN或者REMOVE記錄,要不就表示這條是臟數據,會被自動刪除。
READ 當我們調用get方法時,會向journal寫入一條READ記錄