緩存分為:內(nèi)存緩存+存儲設(shè)備緩存,在Android中對應:LruCache+DiskLruCache.
首先,LruCache(實現(xiàn)原理為LinkedHashMap)是3.1以后加入的一個api,可以使用v4包兼容至2.2版本。
LruCache(線程安全)內(nèi)部是一個LinkedHashMap以強引用的方式存儲外界的緩存對象。
- 強引用:直接的對象引用。
- 軟應用:當一個對象只有軟應用存在時,系統(tǒng)內(nèi)存不足時此對象會被gc回收。
- 弱引用:當一個對象只有弱引用存在時,此對象會隨時被回收。
DiskLruCache(創(chuàng)建、緩存添加、緩存查找)
1.創(chuàng)建
使用DisLruCache.open(File directory,inter appVersion,int valueCount,long maxSize)方法
- directory:緩存路徑,如果想跟隨應用被卸載而刪除,請選擇/sdcard/Android/data/package_name/cache
- appVersion:版本號,一般填 1,如果升級為2時,緩存會被清除(開發(fā)時沒必要清除緩存)。
- valueCount:單個節(jié)點所對應的數(shù)據(jù)個數(shù)。一般為1。
- maxSize:緩存總大小,注意單位為字節(jié)。
2.緩存添加
緩存添加時通過Editor(和sharedPreference相似)完成。
圖片緩存:
- 獲取圖片url所對應的key(采用url的md5值作為key)
- DiskLruCache.Editor editor = DiskLruCache.editor(key);
- OUtputStream outputStream = editor.newOutputStream(DISK_CACHE_INDEX);因為一個節(jié)點只有一個數(shù)據(jù),故DISK_CACHE_INDEX = 0;
- 通過流將圖片寫入到文件中
- 調(diào)用editor.commit()方法提交寫操作。
注意:寫入完成后,記得關(guān)閉流。
3.緩存查找
- 通過url得到key,通過DiskLruCache.get(key)得到一個Snapshot對象
- 通過Snapshot對象可以得到緩存的輸入流,就能得到bitmap了。
注意:這里bitmap要考慮OOM的問題,所以要進行縮放,但是文件輸入流因為是優(yōu)秀的文件流,所以不能兩次調(diào)用decodeStream(第二次會為null),所以要通過文件流獲取文件描述符,然后再通過BitmapFactory.decodeFileDescriptor方法加載縮放后的圖片。