「Glide」源码解析系列git
Engine将要加载的资源在引用缓存和内存缓存中均未命中,重任就交到了Job身上。github
这节就来看看有几种Job,他们的功能是什么!设计模式
此节涉及到的类有
EngineJob
GlideExecutor
DecodeJob缓存
这是Engine.load方法中,Job逻辑调用相关的代码网络
梳理流程:ide
可以看出engineJob和decodeJob并非同一级,engineJob调用decodeJob使其工做,而后engineJob将工做状态回调到SingleRequest。(挖了这么深,终于触底反弹了)ui
先来看看EngineJob对象的产生spa
Pools.Pool的用法在「Glide」请求的生成一节中有介绍线程
这里经过pool复用EngineJob对象,经过init方法重置参数设计
这是EngineJob的构造参数,有没有注意到Executor,是否是眼前一亮【线程池】
线程相关内容能够看如下Android中的线程问题回忆下。
EngineJob的Executor来自EngineJobFactory
EngineJobFactory的Executor来自Engine
Engine来自GlideBuilder,这也是为何在「Glide」中的Engine一篇中花篇幅讲Engine的起源(早期的伏笔)
看到,全部的Executor来自GlideExecutor
以newSourceExecutor为例
计算最优线程数
注意红蓝框的区别
先生成ThreadPoolExecutor对象,做为参数生成GlideExecutor
重点:GlideExecutor采用了静态代理模式,外部将任务交到GlideExecutor执行,但实际的执行者是ThreadPoolExecutor,优势是统一了Glide中全部的Executor为GlideExecutor,达到了高内聚的目的
不清楚的可阅读常见设计模式总结
咱们知道线程池ThreadPoolExecutor的区别在于参数
重点看看DefaultThreadFactory
DefaultThreadFactory对象在初始化时传入了一个布尔值变量preventNetworkOperations译为阻止网络操做
这里是生成SourceExecutor传入的值为false,不进入if逻辑
而DiskCacheExecutor传入的是true
preventNetworkOperations参数的做用是什么
if逻辑内设置了StrictMode,不清楚的能够参考这篇文章StrictMode机制以及使用场景
效果是:有网络请求,杀死此线程
这下再回去看看传入的布尔值,
从DiskCache中加载资源执行的线程,禁止网络请求
从源加载资源执行的线程,容许网络请求
这是GlideExecutor中即重要有容易忽略的点
有了EngineJob对象,也知道了其内部Executor的异同来看看DecodeJob
与EngineJob生成对象相同的手法:复用对象、重置参数
注意到DecodeJob实现了Runnable接口,而EngineJob内有Executor
果不其然,DecodeJob对象被放到了EngineJob中Executor执行了
中途Executor的选择跳过。。。
来到DecodeJob的run
经过变量runReason选择性的进入分支
stage记录目前执行阶段,currentGenerator记录目前Generator
runGenerators方法推动stage和currentGenerator的变化,进入下一阶段
在runGenerators中while一直在推动stage和currentGenerator向下一阶段变化
各级缓存和源的处理都在其中
Engine只是个状态观察者,实际还要回调到SingleRequest对象
实际的工做由DecodeJob作,而EngineJob负责分配DecodeJob工做所处的线程