一、LruCache介绍
LruCache是基于LinkedHashMap实现的。LinkedHashMap维护了插入元素的顺序。
具体实现可以参见这篇文章:理解LinkedHashMap
下面这张图生动的演示了LRU的思想:
LruCache是对LinkedHashMap的包装:
public LruCache(int maxSize) {
if (maxSize <= 0) {// 设置LRUCache的大小
throw new IllegalArgumentException("maxSize <= 0");
}
this.maxSize = maxSize;
this.map = new LinkedHashMap<K, V>(0, 0.75f, true);//设置访问顺序维护队列
}
sizeOf 需要手动复写,来计算每个value的大小
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight()/1024;
}
put方法:调用LinkedHashMap像map中添加元素,同时size+新元素的大小,如果添加元素的时候,覆盖了旧元素,则size减去旧元素的大小,最后调用trimToSize来更新LRUCache的大小,删除LinkedHashMap中旧的元素,直到size小于maxSize。
trimToSize:判断LRUCache的大小,是否小于MaxSize,如果不小于,则删除最旧的元素(通过调用LinkedHashMap的eldest获取)
get方法:就是调用LinkedHashMap来获取元素,同时更新了元素的顺序。
二、DiskLRUCache
DiskLRUCache 是一个非官方的工具类,但是已经获得了google的官方推荐。
目前很多主流应用和三方库都是用了这个工具,它通过journal文件更新缓存文件的key和文件的关系。
主要特点有如下:
1、单例实现,通过open方法获得实例,有File directory, int appVersion, int valueCount, long maxSize这几个参数,一个是缓存目录,一个最大size,其他两个不用太关心
2、通过edit获得Edit对象,来进行编辑
通过edit.commit来提交编辑
通过edit.abort 取消编辑,回退到原状态
3、读取缓存:
通过mDiskLruCache.get获取DiskLruCache.Snapshot对象,然后通过Snapshot对象获取缓存的流outputStream,进而获取数据。
4、其他api:
remove(key)删除缓存
size 所有缓存的大小
flush更新journal文件,更新日志
close 关闭
delete 删除所有缓存文件
参考资料:
Android DiskLruCache完全解析,硬盘缓存的最佳方案
android基础---->LruCache的使用及原理
彻底解析Android缓存机制——LruCache
理解LinkedHashMap
网友评论