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中根据访问顺便排序。当总的缓存大小超过最大值时,优先清除不常访问的缓存。

相关推荐
工程师老罗11 小时前
如何在Android工程中配置NDK版本
android
Libraeking14 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位15 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen12317 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs17 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob17 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔17 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99617 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly19 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首20 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节