Bitmap的加载和Cache--学习笔记2
缓存策略:
LRU算法:会优先淘汰那些近期最少使用的缓存对象,包含两种LruCache和DiskLruCache
LruCache(实现内存缓存,建议使用-v4兼容包提供的LruCache):
LruCache是一个泛型类,它内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,LruCache会移除较早使用的缓存
对象,然后再添加新的缓存对象。下面解析一下强引用、软引用和弱引用的区别
-- 强引用:直接的对象引用
-- 软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被gc回收(gc--垃圾回收机制)
-- 弱引用:当一个对象只用弱引用存在时,此对象会随时被gc回收。
另外LruCache是线程安全的(多线程访问统一代码,不会产生不确定的结果)。
LruCache的初始化:
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap bitmap){
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
}
}
只需要提供缓存的总容量大小并重写sizeOf方法即可,sizeOf方法的作用是计算缓存对象的大小,这里的大小的单位需要和总容量的单位一致。
上面代码示例,总容量的大小为当前进程的可用内存的1/8,单位为KB,而sizeOf方法则完成了Bitmap对象的大小计算。除以1024是为了将其单位转换为KB。
一般情况下,还需要重写LruCache的entryRemoved方法,LruCache移除旧缓存时会调用entryRemoved方法,在entryRemoved中完成一些资源回收工作。
还有缓存的获取:mMemoryCache.get(key) //获取一个缓存对象
缓存的添加:mMemoryCache.put(key,bitmap) //添加一个缓存对象
remove方法即可删除一个指定的缓存对象。
DiskLruCache(存储设备缓存、磁盘缓存)
1.DiskLruCache的创建(不能通过构造方法创建):
public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
open方法四个参数:directory:表示磁盘缓存在文件系统中的存储路径,可以是SD卡上的缓存目录,也可以是指定其他目录。
appVersion:表示应用的版本号,当版本号发生改变时DiskLruCache会清空之前所有的缓存文件,一般只设为1。
valueCount:表示单个节点所对应的数据的个数,一般设为1即可。
maxSize:表示缓存的总大小,比如50MB,当超出设定值后DiskLruCache会清除一些缓存从而保证总大小不大于这个设定值
2.DiskLruCache的缓存添加:
DiskLruCache是缓存添加是通过Editor完成的,Editor表示一个缓存对象的编辑对象。DiskLruCache不允许同时编辑一个缓存对象