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 是磁盘缓存。两者可以结合使用,形成二级缓存机制:
- 先从 LruCache 中获取数据,命中则直接返回。
- 未命中时从 DiskLruCache 加载,并存入 LruCache。
- 数据更新时同步更新两级缓存。
这种策略既能保证高速访问,又能减少内存压力。
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
