Glide 中的缓存类型
- 活动资源 (Active Resources) - 现在是否有另一个 View 正在展示这张图片?
- 内存缓存 (Memory cache) - 该图片是否最近被加载过并仍存在于内存中?
- 资源类型(Resource) - 该图片是否之前曾被解码、转换并写入过磁盘缓存?
- 数据来源 (Data) - 构建这个图片的资源是否之前曾被写入过文件缓存?
从内存加载
活动资源(ActiveResources)
活动资源表示即将加载的图片正在被别的 ImageView 展示。
Glide 中使用弱引用收集了正在展示的图片数据,如果新加载的数据的 key
和正在被 ImageView 展示的数据 key
一致,就会获取活动资源中的数据被使用。
// Engine.java
public <R> LoadStatus load(
···
···
···) {
long startTime = VERBOSE_IS_LOGGABLE ? LogTime.getLogTime() : 0;
// 这个 key 用于缓存
EngineKey key =
keyFactory.buildKey(
model,
signature,
width,
height,
transformations,
resourceClass,
transcodeClass,
options);
EngineResource<?> memoryResource;
synchronized (this) {
// 从内存中加载数据
memoryResource = loadFromMemory(key, isMemoryCacheable, startTime);
// 内存中没有,开始一个新的数据加载
if (memoryResource == null) {
return waitForExistingOrStartNewJob(
···
···
···
;
}
}
// 如果成功的从内存中加载了数据
cb.onResourceReady(memoryResource, DataSource.MEMORY_CACHE);
return null;
}
// 从内存中加载数据
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;
}
private EngineResource<?> loadFromActiveResources(Key key) {
// 从正在显示的资源中获取
EngineResource<?> active = activeResources.get(key);
if (active != n