LruCache二级缓存的原理(以显示图片缩略图为例)
第一级缓存:内存,首先查找内存中有无缩略图,有则显示,无则继续查找第二级缓存:该应用为缩略图在磁盘中开辟的缓存池,一般来说,默认的磁盘缓存池地址为:/mnt/sdcard/Android/data/AppPackageName/cache,如果缓存池中有就直接显示,如果缓存池也没有该缩略图,就从原图创建该图的缩略图,最后把创建好的缩略图保存在内存和缓存池,同时显示。
显示图片缩略图代码示例
/**
* LruCache二级缓存的思想:
* 第一级:内存,首先查找内存中有无缩略图,有则显示,无则查找第二级
* 第二级:该应用为缩略图在磁盘中开辟的缓存池,即
* /mnt/sdcard/Android/data/AppPackageName/cache
* 1、如果缓存池中有就直接显示
* 2、如果缓存池也没有该缩略图,就从原图创建该图的缩略图
* 3、把创建好的缩略图保存在内存和缓存池,同时显示
*
*/
public class ImageTwoStageCache {
//内存缓存类
private LruCache<String, Bitmap> caches;
//本地缓存文件夹
private String localCachePath;
//使用线程池管理生成缩略图的线程
private ExecutorService executorService;
//记录当前任务的加载情况,一个地址关联一个视图
private Map<String, ImageView> currentTask;
//单例懒汉式
private ImageTwoStageCache(Context context){
//获取系统分配给应用的运行空间的1/8来作为缩略图缓存的最大空间,即缓存池
int ImageCachePool = (int) (Runtime.getRuntime().maxMemory() / 8);
//初始化内存缓存对象
caches = new LruCache<String, Bitmap>(ImageCachePool){
@Override
protected int sizeOf(String key, Bitmap value) {
//计算缓存图片的大小
return value.getRowBytes() * value.getHeight();
}
};
//获取缓存文件夹: /mnt/sdcard/Android/data/AppPackageName/cache
loc