上一篇文章《Glide原理解析(一):加载流程分析》主要大致地分析了Glide加载图片的整体流程,这一篇主要解决的上一篇遗留的一个问题:
Glide Engine 如何加载图片,内部涉及到Glide的缓存模块
上篇文章在SingleRequest中获取到了ViewTarget的宽高之后(假定是ImageView),onSizeReady()调用了engine的load()方法
loadStatus = engine.load(
glideContext,
model,
requestOptions.getSignature(),
this.width,
this.height,
requestOptions.getResourceClass(),
transcodeClass,
priority,
requestOptions.getDiskCacheStrategy(),
requestOptions.getTransformations(),
requestOptions.isTransformationRequired(),
requestOptions.isScaleOnlyOrNoTransform(),
requestOptions.getOptions(),
requestOptions.isMemoryCacheable(),
requestOptions.getUseUnlimitedSourceGeneratorsPool(),
requestOptions.getUseAnimationPool(),
requestOptions.getOnlyRetrieveFromCache(),
this);
在看Engine的load()方法之前,先看下Engine主要的数据结构
private final Jobs jobs;
负责缓存EngineJob的管理类private final EngineKeyFactory keyFactory;
负责创建缓存的keyprivate final DecodeJobFactory decodeJobFactory;
负责创建DecodeJob, DecodeJob负责从缓存或原始资源解码转换private final EngineJobFactory engineJobFactory;
负责创建EngineJob,EngineJob负责处理DecodeJob的加载结果private final ResourceRecycler resourceRecycler;
当资源被移除或者释放时,负责回收资源(可能是被回收到其他的LruCache中去)private final MemoryCache cache;
内部是LruCache缓存private final LazyDiskCacheProvider diskCacheProvider;
内部是DiskLruCache缓存private final ActiveResources activeResources;
内部是弱引用缓存,当前活跃的缓存资源
看完了上面的数据结构,开始load()加载资源
// Engine.java
public <R> LoadStatus load(
GlideContext glideContext,
Object model,
Key signature,
int width,
int height,
Class<?> resourceClass,
Class<R> transcodeClass,
Priority priority,
DiskCacheStrategy diskCacheStrategy,
Map<Class<?>, Transformation<?>> transformations,
boolean isTransformationRequired,
boolean isScaleOnlyOrNoTransform,
Options options,
boolean isMemoryCacheable,
boolean useUnlimitedSourceExecutorPool,
boolean useAnimationPool,
boolean onlyRetrieveFromCache,
ResourceCallback cb) {
// 根据图像类型、原始宽高、目标宽高、转换等各种因素创建一个Key
EngineKey key = keyFactory.buildKey(model, signature, width, height, transformations,
resourceClass, transcodeClass, options);
// 从当前活跃资源里面获取
EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);
if (active != null) {
// 获取成功,直接回调返回
cb.onResourceReady(active, DataSource.MEMORY_CACHE);
return null;
}
// 从LruCache资源获取
EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);
if (cached != null) {
// 获取成功,直接回调返回
cb.onResourceReady(cached, DataSource.MEMORY_CACHE);
return null;
}
// 从DiskLruCache资源获取
EngineJob<?> current = jobs.get(key, onlyRetrieveFromCache