Android LruCache 核心机制解析

LruCache 的基本概念

LruCache 是 Android 提供的一个基于 LRU(Least Recently Used)算法的缓存工具类,位于 android.util 包中。LRU 算法会优先淘汰最近最少使用的缓存对象,适用于需要高效管理内存的场景。

LruCache 的核心思想是通过 LinkedHashMap 维护一个双向链表,记录对象的访问顺序。最近访问的对象会被移到链表的头部,而长时间未使用的对象会被逐渐移到尾部,当缓存空间不足时优先移除尾部的对象。

LruCache 的初始化与关键参数

LruCache 的构造函数接受一个 maxSize 参数,表示缓存的最大容量。缓存的大小可以通过 sizeOf(K key, V value) 方法计算,默认情况下每个对象的大小为 1。可以通过重写 sizeOf 方法自定义对象大小的计算逻辑。

LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(maxSize) {
    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getByteCount() / 1024; // 以 KB 为单位计算大小
    }
};

LruCache 的核心方法解析

put(K key, V value)
将键值对存入缓存。如果缓存已满,会根据 LRU 算法移除最久未使用的对象。插入新对象后,会调用 entryAdded 方法(默认空实现,可重写)。

get(K key)
根据键获取缓存中的对象。如果对象存在,会被移到链表头部,表示最近被使用过。如果对象不存在,可以重写 create(K key) 方法生成默认值。

remove(K key)
从缓存中移除指定键的对象。移除时会调用 entryRemoved 方法,可以在此处理资源释放等逻辑。

trimToSize(int maxSize)
调整缓存大小至指定值。如果当前缓存大小超过 maxSize,会从链表尾部开始移除对象,直到满足大小要求。

LruCache 的底层实现

LruCache 内部通过 LinkedHashMap 实现缓存存储。LinkedHashMap 的 accessOrder 参数设置为 true,使得每次访问对象时都会调整其在链表中的位置。

private final LinkedHashMap<K, V> map;

get 方法中,LinkedHashMap 的 get 方法会被调用,触发对象的移动:

public final V get(K key) {
    V mapValue = map.get(key);
    if (mapValue != null) {
        return mapValue;
    }
    // 处理 create 逻辑
}

LruCache 的缓存策略扩展

可以通过重写以下方法实现自定义缓存策略:

entryRemoved(boolean evicted, K key, V oldValue, V newValue)
当对象被移除时调用,evicted 表示是否因缓存满被移除。可以在此释放资源或记录日志。

create(K key)
get 方法未命中缓存时调用,用于生成默认值。例如从磁盘加载图片。

LruCache 的使用场景与优化

LruCache 适用于需要高效管理内存的场景,例如图片缓存、数据模型缓存等。使用时需注意以下几点:

  • 合理设置 maxSize,避免占用过多内存或频繁触发移除逻辑。
  • 重写 sizeOf 确保缓存大小计算准确,避免内存泄漏。
  • 结合 entryRemoved 实现资源释放,例如回收 Bitmap。

LruCache 与 DiskLruCache 的结合

LruCache 是内存缓存,而 DiskLruCache 是磁盘缓存。两者可以结合使用,形成二级缓存机制:

  1. 先从 LruCache 中获取数据,命中则直接返回。
  2. 未命中时从 DiskLruCache 加载,并存入 LruCache。
  3. 数据更新时同步更新两级缓存。

这种策略既能保证高速访问,又能减少内存压力。

BbS.okane060.info/PoSt/1121_910545.HtM
BbS.okane061.info/PoSt/1121_753923.HtM
BbS.okane062.info/PoSt/1121_585700.HtM
BbS.okane063.info/PoSt/1121_859866.HtM
BbS.okane065.info/PoSt/1121_840533.HtM
BbS.okane066.info/PoSt/1121_747042.HtM
BbS.okane067.info/PoSt/1121_528756.HtM
BbS.okane068.info/PoSt/1121_512940.HtM
BbS.okane069.info/PoSt/1121_243587.HtM
BbS.okane070.info/PoSt/1121_630236.HtM
BbS.okane060.info/PoSt/1121_698092.HtM
BbS.okane061.info/PoSt/1121_353938.HtM
BbS.okane062.info/PoSt/1121_710087.HtM
BbS.okane063.info/PoSt/1121_470100.HtM
BbS.okane065.info/PoSt/1121_564516.HtM
BbS.okane066.info/PoSt/1121_928125.HtM
BbS.okane067.info/PoSt/1121_553748.HtM
BbS.okane068.info/PoSt/1121_296124.HtM
BbS.okane069.info/PoSt/1121_683543.HtM
BbS.okane070.info/PoSt/1121_139349.HtM
BbS.okane060.info/PoSt/1121_047649.HtM
BbS.okane061.info/PoSt/1121_082124.HtM
BbS.okane062.info/PoSt/1121_368014.HtM
BbS.okane063.info/PoSt/1121_728473.HtM
BbS.okane065.info/PoSt/1121_648714.HtM
BbS.okane066.info/PoSt/1121_052727.HtM
BbS.okane067.info/PoSt/1121_254136.HtM
BbS.okane068.info/PoSt/1121_130922.HtM
BbS.okane069.info/PoSt/1121_069223.HtM
BbS.okane070.info/PoSt/1121_222745.HtM
BbS.okane060.info/PoSt/1121_387079.HtM
BbS.okane061.info/PoSt/1121_921001.HtM
BbS.okane062.info/PoSt/1121_937399.HtM
BbS.okane063.info/PoSt/1121_063791.HtM
BbS.okane065.info/PoSt/1121_946484.HtM
BbS.okane066.info/PoSt/1121_490331.HtM
BbS.okane067.info/PoSt/1121_406828.HtM
BbS.okane068.info/PoSt/1121_990077.HtM
BbS.okane069.info/PoSt/1121_554643.HtM
BbS.okane070.info/PoSt/1121_960585.HtM
BbS.okane060.info/PoSt/1121_084743.HtM
BbS.okane061.info/PoSt/1121_092444.HtM
BbS.okane062.info/PoSt/1121_754037.HtM
BbS.okane063.info/PoSt/1121_525165.HtM
BbS.okane065.info/PoSt/1121_508110.HtM
BbS.okane066.info/PoSt/1121_723340.HtM
BbS.okane067.info/PoSt/1121_266473.HtM
BbS.okane068.info/PoSt/1121_316993.HtM
BbS.okane069.info/PoSt/1121_124917.HtM
BbS.okane070.info/PoSt/1121_038806.HtM
BbS.okane060.info/PoSt/1121_191720.HtM
BbS.okane061.info/PoSt/1121_141268.HtM
BbS.okane062.info/PoSt/1121_603768.HtM
BbS.okane063.info/PoSt/1121_840703.HtM
BbS.okane065.info/PoSt/1121_818924.HtM
BbS.okane066.info/PoSt/1121_177865.HtM
BbS.okane067.info/PoSt/1121_053095.HtM
BbS.okane068.info/PoSt/1121_738391.HtM
BbS.okane069.info/PoSt/1121_204666.HtM
BbS.okane070.info/PoSt/1121_153909.HtM
BbS.okane071.info/PoSt/1121_226413.HtM
BbS.okane072.info/PoSt/1121_753401.HtM
BbS.okane073.info/PoSt/1121_337972.HtM
BbS.okane074.info/PoSt/1121_905133.HtM
BbS.okane075.info/PoSt/1121_456742.HtM
BbS.okane076.info/PoSt/1121_443174.HtM
BbS.okane077.info/PoSt/1121_024014.HtM
BbS.okane078.info/PoSt/1121_157249.HtM
BbS.okane079.info/PoSt/1121_567391.HtM
BbS.okane080.info/PoSt/1121_905696.HtM
BbS.okane071.info/PoSt/1121_652979.HtM
BbS.okane072.info/PoSt/1121_541219.HtM
BbS.okane073.info/PoSt/1121_792220.HtM
BbS.okane074.info/PoSt/1121_417153.HtM
BbS.okane075.info/PoSt/1121_870763.HtM
BbS.okane076.info/PoSt/1121_842643.HtM
BbS.okane077.info/PoSt/1121_192627.HtM
BbS.okane078.info/PoSt/1121_928473.HtM
BbS.okane079.info/PoSt/1121_746660.HtM
BbS.okane080.info/PoSt/1121_634575.HtM

#牛客AI配图神器#

全部评论

相关推荐

11-17 11:15
门头沟学院 Java
金山办公终于发offer了,但薪资和平台都不如已有的offer打算拒了,A不了薪资,不满意直接拒了,留给需要的人嘿嘿嘿时间线:10.14线下一面&nbsp;,10.23线上二面,下午发测评,11月1日HR面,11月14日电话谈薪,11月17日直接发offer
star__plat...:好兄弟干的好啊,解气。金山第一次笔难度高的离谱,第二次简单的离谱全A了,用人部门筛选中估计最后还是要挂我,就这今早智联招聘还给我发信息让我投
offer帮选
点赞 评论 收藏
分享
09-29 00:03
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务