LruCache是Android提供的一个缓存工具类,该工具类依赖于最近最少使用的算法,这种算法的原理即是把最近使用的对象用强引用存储在LinkedHashMap中,并且把最近最少
使用的对象在缓存值达到峰值时把它从内存中移除。
下面来讲解下,如何用该工具类缓存数据(这里我用了一个RecyclerView加载图片的Demo)
1、初始化LruCache
初始化LrcCache 首先得给它设置一个空间大小,这里官方推荐使用当前使用的应用的内存的1/8
/**
* 得到当前的缓存大小(以当前内存的1/8,单位Kb)
*
* @return
*/
public int getMemoryCacheSize() {
return (int) Runtime.getRuntime().maxMemory() / 8 / 1024;
}
的地址,Bitmap为存储的值。所以初始化大概就长这样
memoryCache = new LruCache<String, Bitmap>(getMemoryCacheSize()) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount() / 1024;//这里重写了这个函数,可以查看缓存空间使用的大小
}
};
2、初始化完之后,就到了最关键的地方,将对象缓存到缓存中,将对象从缓存中移除,移除缓存空间(具体看代码,没什么难度,主要就是调用工具类里面的方法)
/**
* 清空当前缓存
*/
public void clearCache() {
if (memoryCache != null) {
if (memoryCache.size() > 0) {
memoryCache.evictAll();
}
memoryCache = null;
}
}
/**
* 添加对象进缓存
*
* @param key
* @param bitmap
*/
public synchronized void addBitmapToMemoryCache(String key, Bitmap bitmap) {
Log.d(TAG, "当前缓存的数:" + memoryCache.size());
if (memoryCache.get(key) == null) {
if (key != null && bitmap != null) {
memoryCache.put(key, bitmap);
}
} else {
Log.i(TAG, "The key has already existed ");
}
}
/**
* 获取缓存中的对象
*
* @param key
* @return
*/
public synchronized Bitmap getBitmapFromMemCache(String key) {
Bitmap bm = memoryCache.get(key);
if (key != null)
return bm;
return null;
}
/**
* 移除某一个对象
*
* @param key
*/
public synchronized void removeImageCache(String key) {
if (key != null) {
if (memoryCache != null) {
Bitmap bm = memoryCache.remove(key);
if (bm != null)
bm.recycle();
}
}
}
3、下面就是使用缓存
因为是用RecyclerView来显示图片,所以在ImageView显示图片之前需要从缓存中判断该图片是否已经存在,存在就从缓存中读取该Bitmap,不存在的话就先将图片资源获取
到然后给ImageView和缓存起来
Bitmap bitmap = LruCacheUtil.getInstance().getBitmapFromMemCache(urls[position]);
if (bitmap != null) {
holder.imageView.setImageBitmap(bitmap);
} else {
LruCacheUtil.getInstance().addBitmapToMemoryCache(urls[position], decodeSampledBitmapFromResource(urls[position], 400, 300));
holder.imageView.setImageBitmap(decodeSampledBitmapFromResource(urls[position], 400, 300));
}
4、以上就是使用缓存技术的具体实现
下面贴出两张图来对比下使用缓存和没使用缓存加载图片的效果
这是没有使用缓存,明显感到卡顿
使用了缓存的
最后如果你需要源码,点击这儿