Java简单了解LruCache源码

1.在LruCache的构造器中很明显知道LruCache使用LinkedHashMap,并且将accessOrder设置为true。这样在使用LinkedHashMap的get()方法的时候就会使其双链表重新进行排序,也就是将当前查询的节点断开,然后调用addBefore()方法重新将节点添加到双链表的头部。并且传递了LruCache所占的内存的大小maxsize。
这里写图片描述
2.调用put()方法,其中的safeSizeOf()方法中调用了sizeOf()方法,其中默认的是返回的1.这个需要我们重写sizeOf()方法,进行计算大小。其中sizeOf()就是进行计算存储的数据所占的内存的大小。 size+=safeSizeOf(key,value)就是进行添加新的数据的时候,新数据占据的内存的大小。如果previous!=null那么证明当前的key值下原先已经有数据,那么添加数据的时候就会进行替换。这时候要进行计算旧数据的大小,然后用size减去旧数据的大小。
这里写图片描述
这里写图片描述
这里写图片描述
然后调用trimToSize(maxSize)方法,进行判断添加数据后,是否超出设定的存储大小。如果没有超过设定的存储数值,那么就跳出这个循环。否则就使用LinkedHashMap的中的方法将最老的节点删除。获取最老节点的方法和LinkedHashMap中的addBefore()方法相关。
这里写图片描述

使用LruCache中的get()方法,在这个方法中如果取key的时候,没有这个数值,那么就调用create(key)方法创建一个value数值,然后调用put()方法存储进去。
这个create(key)默认返回的就是null。这个create()方法能够进行重写,估计是为了提供默认存储的数值进行的一种设计。
这里写图片描述
这里写图片描述

具体的用法:

long maxMemory = Runtime.getRuntime().maxMemory();
    int cacheSize = (int) (maxMemory / 8);
    LruCache lruCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap value) {
            return value.getByteCount();
        }

        @Override
        protected Bitmap create(String key) {
            return null;
        }
    };
发布了290 篇原创文章 · 获赞 13 · 访问量 9万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览