以下针对 Android API 26 版本的源码进行分析。
在了解LruCache之前,最好对LinkedHashMap有初步的了解,LruCache的实现主要借助LinkedHashMap。LinkedHashMap的源码解析,可阅读Java——LinkedHashMap源码解析
概述
LruCahce其 Lru 是 Least Recently Used 的缩写,即最近最少使用,是包含对有限数量值的强引用的缓存。每当一个值被访问,它将被移到队尾。当缓存达到指定的数量时,位于队头的值将被移除,并且可能被 GC 回收。如果缓存的值包含需要显式释放的资源,那么需要重写entryRemoved方法。如果 key 对应的缓存未命中,通过重写create方法创建对应的 value。这可以简化代码调用:即使存在缓存未命中,也允许假设始终返回一个值。
默认情况下,缓存大小以条目数量度量。在不同缓存对象下,通过重写sizeOf方法测量 key-value 缓存的大小。例如如下的例子,这个缓存限制了 4MiB 大小的位图:
这个类是线程安全的,通过在缓存上执行同步操作来以原子方式执行多个缓存操作:
这个类不允许空值作为 key 或者 value,对于get、put、remove方法返回null值是明确的行为:缓存中不存在这个键。
源码分析
主要字段
|
|
构造函数
|
|
Size操作
LruCache在默认情况下,size 指的是 key-value 条目的个数,当重写sizeOf函数时,可以自定义 key-value 条目的单位大小,如概述中位图的例子,其通过重写sizeOf函数,返回的大小值并非是 1,而是不同Bitmap对象的字节大小。
查询
|
|
存储
|
|
删除
|
|