Glide源码——Engine EngineJob部分

之前的文章分析了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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值