之前的文章分析了Engine获取ActiveResource、LruResourceCache两个缓存部分,当EngineKey没有找到对应的缓存时,Engine就需要通过EngineJob来获取资源。本篇文章涉及到的类:EngineJob、Jobs。
首先判断是否有正在进行的EngineKey的EngineJob,有则把当前cb(其实是SingleRequest)传递给该EngineJob等待回调资源,然后直接返回。
EngineJob<?> current = jobs.get(key, onlyRetrieveFromCache);
if (current != null) {
current.addCallback(cb, callbackExecutor);
return new LoadStatus(cb, current);
}
jobs是Engine的成员变量,是一个Jobs类的实例,Jobs是一个管理类,维护了EngineKey、EngineJob的map,代码很简短:
final class Jobs {
private final Map<Key, EngineJob<?>> jobs = new HashMap<>();
private final Map<Key, EngineJob<?>> onlyCacheJobs = new HashMap<>();
……
EngineJob<?> get(Key key, boolean onlyRetrieveFromCache) {
return getJobMap(onlyRetrieveFromCache).get(key);
}
void put(Key key, EngineJob<?> job) {
getJobMap(job.onlyRetrieveFromCache()).put(key, job);
}
……
private Map<Key, EngineJob<?>> getJobMap(boolean onlyRetrieveFromCache) {
return onlyRetrieveFromCache ? onlyCacheJobs : jobs;
}
}
如果没有找到对应的EngineJob,则创建之:
EngineJob<R> engineJob =
engineJobFactory.build(key, isMemoryCacheable, useUnlimitedSourceExecutorPool, useAnimationPool, onlyRetrieveFromCache);
DecodeJob<R> decodeJob =
decodeJobFactory.build(glideContext, model, key, signature, width, height, resourceClass, transcodeClass, priority, diskCacheStrategy,
transformations, isTransformationRequired, isScaleOnlyOrNoTransform, onlyRetrieveFromCache, options, engineJob);
jobs.put(key, engineJob);
engineJob.addCallback(cb, callbackExecutor);
engineJob.start(decodeJob);
return new LoadStatus(cb, engineJob);
同时还创建了一个DecodeJob,这个后面再分析,调用engineJob.addCallback给当前Request加上监听,调用engineJob.start就开始真正的获取资源逻辑了。
EngineJob的创建由其内部类EngineJobFactory实现,EngineJobFactory有一个成员变量 Pools.Pool<EngineJob<?>> pool,即这里也用到了v4包的实例缓存池Pools类,关于这一点在之前分析SingleRequest的时候已经介绍过了。
TODO.