Android中的缓存策略

三级缓存

当内存中不存在该图片时从存储设备中加载,当存储设备中也不存在该图片时从网络中去获取。
缓存一般要包含添加 获取 删除三类操作。
LruCache (Least Recently Used 最近最少使用算法,内存缓存),DiskLruCache(存储缓存)。

LruCache

LruCache缓存用于实现内存缓存。
LruCache是Android3.1提供的一个缓存类(泛型类),其内部采用LinkedHashMap以强引用的方式存储缓存对象,其提供get,put方法完成缓存的获取及添加。
        强引用:直接的对象引用
   软引用:若对象只有软引用,系统内存不足时此对象会被gc回收。
弱引用:若对象只有弱引用,此对象随时会被gc回收。
此外LruCache是线程安全的,使用时不必考虑同步问题。
使用:
LruCache<String , Bitmap> ACache=new LruCache<String, Bitmap>((int) (Runtime.getRuntime().maxMemory()/(1024*1024)/5)){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight()/(1024*1024);
}
@Override
protected void entryRemoved(boolean evicted, String key,
Bitmap oldValue, Bitmap newValue) {
super.entryRemoved(evicted, key, oldValue, newValue);
}
};
其中只需要重写sizeOf(返回bitmap的大小),跟entryRemoved(删除bitmap)方法。当然也可以自定义类。
注意bitmap的存储是以键值对的形式存储,获取,存放,删除形式如下:
ACache.put("bitmap", null);
ACache.get("bitmap");
ACache.remove("bitmap");

DiskLruCache

DiskLruCache用于实现存储设备缓存。通过将存储对象写入文件系统实现缓存。
其并非android SDK内容,这里不做介绍。

缓存工具类推荐

Picasso.jar其内部实现也是采用三级缓存。使用起来如下:
Picasso.with(mContext).load(path)
.resize(DimenUtil.dpToPx(mContext, 76),DimenUtil.dpToPx(mContext, 76))
.into(imageView);
注意:在加载图片遇到卡顿现象时,多考虑异步任务去执行耗时操作。

你可能感兴趣的:(android,cache,图片缓存)