Android android.util.LruCache源码阅读

android.util.LruCache, 注释如下:

意思是,这是一个缓存工具类,对有限的缓存对象持有强引用。当一个缓存对象被访问,该缓存对象会被移动到一个队列的头部。当缓存已满时添加一个对象,队列尾部的对象将被移除,并可能被垃圾回收。

如果你的缓存值持有需要显式释放的资源,复写方法entryRemoved。

当缓存未命中时,想动态创建数据对象,则覆盖方法create。

默认情况下,缓存大小为entry键值对的数量。可以覆盖sizeof方法使用不同单位测量缓存大小,例如可以使用字节数测量bitmap的大小。

看下构造方法:

传入maxSize为最大缓存大小,默认为存入的缓存的键值对数量。this.map = new LinkedHashMap<K, V>(0, 0.75f, true); 这句代码实例化map用于存放缓存对象。看下第3个参数accessOrder的意思,代码在LinkedHashMap中,如下,意思是遍历该map的顺序,值为true则为访问顺序,false为插入顺序。

传入accessOrder为true,所以LRUCache的map遍历顺序和访问顺序一致。

常用方法:

1、get方法:

根据key值返回缓存的value值(如果没缓存,调用create方法创建对象),缓存对象返回后,该缓存对象将被移动到队列头部。 如果缓存没命中,但是对象创建非空,会把创建的对象存入缓存,总缓存大小size加上新创建的对象大小。

2、put方法

缓存该对象,计算最新缓存大小size的值。再调用trimToSize方法清除旧缓存,然后返回该key值对应的前一个value值。添加的value会被移动到队列头部。

3、trimToSize方法

当缓存size 大于 maxSize, 优先移除最老的缓存,直到size 不大于maxSize为止。

4、remove方法

移除缓存,并计算最新缓存的大小。

5、create方法

默认返回空。获取缓存时,如果缓存为空,会调用该方法创建对象。

6、sizeOf方法

该方法计算缓存对象的大小,默认为1,即一条缓存大小为1. 可以自定义,比如缓存bitmap对象,可以计算其字节数作为缓存大小。

7、evictAll方法

清除缓存

8、entryRemoved方法

该方法当移除缓存时调用,用于释放资源。必要时需实现这个方法。

Ok. 这个类可以用于缓存对象,key-value键值对的形式插入缓存。缓存被存在LinkedHashMap中根据访问顺便排序。当总的缓存大小超过最大值时,优先清除不常访问的缓存。

相关推荐
阿巴斯甜6 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker7 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95278 小时前
Andorid Google 登录接入文档
android
黄林晴9 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android