Android中的緩存策略

緩存分為:內(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方法加載縮放后的圖片。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容