之前学习volley框架,用ImageLoader可以设置内存缓存,用一个LruCache,就可以避免OOM且图片读取速度快,爽极了。
后来想,如果只是内存缓存的话,那退出程序或者内存不够大了,缓存的图片不就被清理掉了,这样每次启动程序就又得去网上下载图片,流量好贵的。
后来想,如果只是内存缓存的话,那退出程序或者内存不够大了,缓存的图片不就被清理掉了,这样每次启动程序就又得去网上下载图片,流量好贵的。
于是找到了磁盘缓存框架DiskLruCache,这是一个挺著名的开源框架,网易云阅读等APP之前都用它来缓存图片,关于这个框架的使用可以看这篇博客。
找到这个框架后我就着手把DiskLruCache和Volley结合起来,用LruCache做一级缓存,用DiskLruCache做二级缓存,这样做使得程序又快又不用每次都去网上下载图片浪费流量。说干咋就干,做前股沟了一下,找到了一篇关于此实现的相关介绍,原来有老外也想到了这点(介绍链接),并把他的代码再github上开源出来。(github地址)
话不多说,down下来后看了这哥们的源码,并不复杂,只不过他并没有实现我心中的二级缓存,而是用BitmapLruImageCache和DiskLruImageCache将两个缓存分开,用的时候在ImageCacheManager里设置用哪个缓存。看来还是得自己动手,不一会儿就把它们揉合在一起了,源码如下:
public class LevelTwoCache implements ImageCache {
private BitmapLruImageCache bitImageCache;
private DiskLruImageCache diskImageCache;
public LevelTwoCache(Context context, String uniqueName, int diskCacheSize, int memCacheSize,
CompressFormat compressFormat, int quality) {
bitImageCache = new BitmapLruImageCache(memCacheSize);
diskImageCache = new DiskLruImageCache(context, uniqueName, diskCacheSize, compressFormat,
quality);
}
/**
* 先从内存获取图片,如果内存找不到就从磁盘里找,找到了存在内存里并返回
*/
@Override
public Bitmap getBitmap(String url) {
String key = createKey(url);
Bitmap bitmap = null;
if (bitImageCache.getBitmap(key) == null) {
if (diskImageCache.containsKey(key)) {
return null;
} else {
bitmap = diskImageCache.getBitmap(key);
bitImageCache.putBitmap(key, bitmap);
}
} else {
bitmap = bitImageCache.getBitmap(key);
}
return bitmap;
}
/**
* 首次图片从网络下载下来后分别保存在内存和磁盘缓存里
*/
@Override
public void putBitmap(String url, Bitmap bitmap) {
String key = createKey(url);
bitImageCache.putBitmap(key, bitmap);
diskImageCache.putBitmap(key, bitmap);
}
/**
* 把url转成MD5
*/
private String createKey(String url) {
return getBitmapMDKey(url);
}
public String getBitmapMDKey(String key) {
String cacheKey;
try {
final MessageDigest mDigest = MessageDigest.getInstance("MD5");
mDigest.update(key.getBytes());
cacheKey = bytesToHexString(mDigest.digest());
} catch (NoSuchAlgorithmException e) {
cacheKey = String.valueOf(key.h