Android Glide 中内存缓存为什么有 activeRe
2023-07-20 本文已影响0人
雁过留声_泪落无痕
背景
版本:4+
问题
为什么设计了 ActiveResources activeResources
和 MemoryCache cache
两种类型的缓存?
Engine.java
private EngineResource<?> loadFromMemory(
EngineKey key, boolean isMemoryCacheable, long startTime) {
if (!isMemoryCacheable) {
return null;
}
EngineResource<?> active = loadFromActiveResources(key);
if (active != null) {
if (VERBOSE_IS_LOGGABLE) {
logWithTimeAndKey("Loaded resource from active resources", startTime, key);
}
return active;
}
EngineResource<?> cached = loadFromCache(key);
if (cached != null) {
if (VERBOSE_IS_LOGGABLE) {
logWithTimeAndKey("Loaded resource from cache", startTime, key);
}
return cached;
}
return null;
}
分析
ActiveResources activeResources
是基于弱引用的(GC 会回收) ,可以一直存,直到 GC,表示正在使用的图片;MemoryCache cache
是基于 LRU 的,有容量限制,但是 GC 不会回收;所以二者相互配合:
-
能不能只用
activeResources
?
不能。一旦 GC,所有图片都要从头加载(假设有磁盘缓存,则从磁盘重新走一遍加载流程)。但是此时若果有cache
则不一样了,它不会受 GC 影响,可以拿过来直接用。 -
能不能只用
cache
?
不能。毕竟cache
是有大小限制的,考虑如下场景:列表中要显示 10 张图片,但是第 1 张和第 10 张时同一个图片,然而由于 10 张图片都不小,导致超过了缓存大小限制,那么会出现缓存第 9 张图片时,就把第 1 张图片剔除缓存了,当要加载第 10 张图片时,不得不又去从头加载。但是如果此时有activeResources
则不一样了,因为该图片时正在使用的图片(第 1 张正在使用),所以直接拿过来用就行了。