使用基本步驟:
1.將DiskCache.java放入你的工程中
2.設(shè)置DiskCache的基本思路:
(1)提供一個(gè)函數(shù)用于初始化文件緩存:該函數(shù)應(yīng)該要能夠完成兩件事:首先應(yīng)該能夠獲取DiskCache目錄,其次要能利用該目錄生成DiskCache緩存。
(2)獲取DiskCache目錄時(shí),首先需要判斷手機(jī)中是否有SD卡;
(3)實(shí)現(xiàn)在DiskCache中獲取資源的方法。該方法需要能夠根據(jù)URL得到資源在DiskCache中的存放文件的文件名。
(4)這個(gè)文件名應(yīng)該是由信息摘要算法MD5產(chǎn)生(得到一個(gè)byte數(shù)組),然后將該數(shù)組轉(zhuǎn)換成16進(jìn)制的格式(可以借助Integer類的toHexString()方法)
(5)實(shí)現(xiàn)在DiskCache中存入資源的方法。
初始化文件緩存
/**
* 初始化文件緩存
*/
private void initDiskLruCache() {
try {
File cacheDir = getDiskCacheDir(context, "bitmap");
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
diskCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, DISK_CACHE_DEFAULT_SIZE);
} catch (IOException e) {
e.printStackTrace();
}
}
判斷是否有SD卡可供使用。
private File getDiskCacheDir(Context context, String uniqueName) {
String cachePath;
//檢測(cè)SD卡是否掛載。如果SD卡處于掛載狀態(tài)或SD卡是不可移除的
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
return new File(cachePath + File.separator + uniqueName);
}
從文件緩存中拿取數(shù)據(jù)
/**
* 從文件緩存中拿
*
* @param url
*/
public Bitmap getBitmapFromDisk(String url) {
try {
//取得在內(nèi)存中存放的hash串的格式
String key = hashKeyForDisk(url);
DiskLruCache.Snapshot snapShot = diskCache.get(key);
if (snapShot != null) {
InputStream is = snapShot.getInputStream(0);
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//為存儲(chǔ)的文件生成一個(gè)散列值作為存儲(chǔ)名。
//MD5 Message Degiest消息摘要算法版本5
//MessageDigest類:用一個(gè)單向散列函數(shù)將一個(gè)任意長度的字節(jié)序列轉(zhuǎn)換成一個(gè)固定長度的字節(jié)序列,原始
//的字節(jié)序列為信息,生成的固定長度的字節(jié)序列為摘要
private String hashKeyForDisk(String key) {
String cacheKey;
try {
//返回一個(gè)使用特定算法的MessageDigest類的實(shí)例。
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(key.getBytes());//使用指定的字節(jié)數(shù)組更新摘要
//digest函數(shù)通過執(zhí)行諸如填充之類的最終操作完成哈希計(jì)算。
//計(jì)算完成后,摘要接收器被重置。(返回值為字節(jié)數(shù)組)
cacheKey = bytesToHexString(mDigest.digest());//轉(zhuǎn)換成十六進(jìn)制串
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(key.hashCode());
}
return cacheKey;
}
將字節(jié)數(shù)組轉(zhuǎn)換成十六進(jìn)制串
private String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
//返回字節(jié)的十六進(jìn)制形式
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}