Andriod DiskLruCache的使用案例


DiskLruCache是谷歌推薦的用來實現硬盤緩存的類,本案例將對DiskLruCache的基本用法做一個總結,包括:創建緩存、查找使用緩存、移除緩存等等。

實現效果圖

這里寫圖片描述

創建DiskLruCache

DiskLruCache使用open方法創建一個實例,如下所示:對應的四個參數分別為:緩存目錄、應用版本號、單個key對應的數據的個數(一般設為1)、緩存的總大小,其中key是圖片的url經過MD5轉碼獲得的,防止url帶有特殊符號影響緩存的正常使用。

try {
File cacheDir = getDiskCacheDir(this, "bitmap");
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(this), 1, 10 * 1024 * 1024);
} catch (Exception e) {
e.printStackTrace();
}

存儲緩存

通過DiskLruCache.Editor可以獲取到緩存對象的編輯對象editor,類似於SharedPreference的editor。DiskLruCache不允許同時編輯一個緩存對象,如果這個緩存對象正在被編輯,則editor==null。

new Thread(new Runnable() {
@Override
public void run() {
try {
String key = hashKeyForDisk(imageUrl);
DiskLruCache.Editor editor = null;

editor = mDiskLruCache.edit(key);
if (editor != null) {
OutputStream outputStream = editor.newOutputStream(0);
if (downloadUrlToStream(imageUrl, outputStream)) {
editor.commit();
} else {
editor.abort();
}
}
//不該頻繁的flush,防止journal日志文件的頻繁修改
mDiskLruCache.flush();
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("saveCache done,the bitmap is ready");
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

讀取緩存

DiskLruCache.get(String key)方法可以獲取到一個Snapshot實例,通過DiskLruCache.Snapshot實例獲取緩存文件的輸入流,即可在imageView上顯示該圖片。

//讀取緩存
try {
DiskLruCache.Snapshot snapshot = mDiskLruCache.get(hashKeyForDisk(imageUrl));
if (snapshot != null) {
InputStream is = snapshot.getInputStream(0);
Bitmap bitmap = BitmapFactory.decodeStream(is);
imageView.setImageBitmap(bitmap);
} else {
imageView.setImageBitmap(null);
}
} catch (IOException e) {
e.printStackTrace();
}

另外,DiskLruCache還提供了清空緩存delete()、獲取緩存目錄下的緩存大小size()等方法操作緩存。

本案例源碼包含了DiskLruCache的基本使用方法,點擊下載


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com