Glide 是如何运作的,这篇3分钟看懂
流程
- with
- 初始化glide,线程池(Engine)[默认使用GlideExecutor, 根据cpu计算线程数量,最小4个 ]
- 监听生命周期和网络
- load 设置资源地址-资源的属性
- into 为target设置request, 加入线程池开始任务
如何回调
into方法
into(
glideContext.buildImageViewTarget(view, transcodeClass),
/*targetListener=*/ null,
requestOptions,
Executors.mainThreadExecutor());
关键地方在最后一个参数, 主线程执行
private static final Executor MAIN_THREAD_EXECUTOR =
new Executor() {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override
public void execute(@NonNull Runnable command) {
handler.post(command);
}
};
网络下载在哪里
DecodeJob
这个是一个Runnable的任务, 我们看看run方法, 主要是runWrapped()
private void runWrapped() {
switch (runReason) {
case INITIALIZE:
//初始化
stage = getNextStage(Stage.INITIALIZE);
currentGenerator = getNextGenerator();
runGenerators();
break;
case SWITCH_TO_SOURCE_SERVICE:
//获取资源(网络/本地)
runGenerators();
break;
case DECODE_DATA:
//解析资源(bitmap/drawable等等)
decodeFromRetrievedData();
break;
default:
throw new IllegalStateException("Unrecognized run reason: " + runReason);
}
}
generator
有以下这几种生成器
private DataFetcherGenerator getNextGenerator() {
switch (stage) {
case RESOURCE_CACHE:
//已经修改过的缓存, 加载到view的
//from cache files containing downsampled/transformed resource data.
return new ResourceCacheGenerator(decodeHelper, this);
case DATA_CACHE:
//原图资源缓存
//from cache files containing original unmodified source data.
return new DataCacheGenerator(decodeHelper, this);
case SOURCE:
//源资源
//from original source data using registered {@link com.bumptech.glide.load.model.ModelLoader ModelLoaders} and the model provided for the load.
return new SourceGenerator(decodeHelper, this);
case FINISHED:
return null;
default:
throw new IllegalStateException("Unrecognized stage: " + stage);
}
}
网络请求处理
- HttpUrlFetcher: HttpURLConnection
- OkHttpStreamFetcher: OkHttp
解析网络数据
ResourceDecoder
有很多种解析器, 主要将网络数据decode成bitmap/drawable, 用于显示.