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不允许同时编辑一个缓存对象

posted @ 2017-05-16 17:15  Calo-missile  阅读(158)  评论(0编辑  收藏  举报