使用基本步骤:
1.将DiskCache.java放入你的工程中
2.设置DiskCache的基本思路:
(1)提供一个函数用于初始化文件缓存:该函数应该要能够完成两件事:首先应该能够获取DiskCache目录,其次要能利用该目录生成DiskCache缓存。
(2)获取DiskCache目录时,首先需要判断手机中是否有SD卡;
(3)实现在DiskCache中获取资源的方法。该方法需要能够根据URL得到资源在DiskCache中的存放文件的文件名。
(4)这个文件名应该是由信息摘要算法MD5产生(得到一个byte数组),然后将该数组转换成16进制的格式(可以借助Integer类的toHexString()方法)
(5)实现在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;
//检测SD卡是否挂载。如果SD卡处于挂载状态或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);
}
从文件缓存中拿取数据
/**
* 从文件缓存中拿
*
* @param url
*/
public Bitmap getBitmapFromDisk(String url) {
try {
//取得在内存中存放的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;
}
//为存储的文件生成一个散列值作为存储名。
//MD5 Message Degiest消息摘要算法版本5
//MessageDigest类:用一个单向散列函数将一个任意长度的字节序列转换成一个固定长度的字节序列,原始
//的字节序列为信息,生成的固定长度的字节序列为摘要
private String hashKeyForDisk(String key) {
String cacheKey;
try {
//返回一个使用特定算法的MessageDigest类的实例。
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(key.getBytes());//使用指定的字节数组更新摘要
//digest函数通过执行诸如填充之类的最终操作完成哈希计算。
//计算完成后,摘要接收器被重置。(返回值为字节数组)
cacheKey = bytesToHexString(mDigest.digest());//转换成十六进制串
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(key.hashCode());
}
return cacheKey;
}
将字节数组转换成十六进制串
private String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
//返回字节的十六进制形式
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}