美文网首页
Android缓存机制---LruCache和DiskLruCa

Android缓存机制---LruCache和DiskLruCa

作者: 梦飞成2012 | 来源:发表于2017-12-09 20:53 被阅读14次

    一、LruCache介绍

    LruCache是基于LinkedHashMap实现的。LinkedHashMap维护了插入元素的顺序。
    具体实现可以参见这篇文章:理解LinkedHashMap
    下面这张图生动的演示了LRU的思想:

    LRU原理.png

    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

    相关文章

      网友评论

          本文标题:Android缓存机制---LruCache和DiskLruCa

          本文链接:https://www.haomeiwen.com/subject/dippixtx.html