当 Glide 从网络加载原始的数据的时候,会来到 HttpUrlFetcher#loadData()
方法,在 Glide 4.9.0 执行流程源码解析 中说过,当加载完成后,会通过 callback.onDataReady()
方法将结果回传,最终会回溯到 DecodeJob#onDataFetcherReady
这个方法中,下面将会回溯的具体流程进行分析。
// HttpUrlFetcher.java
public void loadData(
@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {
long startTime = LogTime.getLogTime();
try {
// 获取网络图片, 内部使用了 HttpURLConnection 实现, 仅仅做了重定向的处理
InputStream result = loadDataWithRedirects(glideUrl.toURL(), 0, null, glideUrl.getHeaders());
// 回调 callback.onDataReady() 方法将结果回传,
// callback 是在调用方法时传递过来的,这里即 SourceGenerator#startNext() 方法中传递的,即 SourceGenerator 对象自身
callback.onDataReady(result);
} catch (IOException e) {
callback.onLoadFailed(e);
} finally {
...
}
}
在 HttpUrlFetcher#loadData()
中得到加载的数据的 InputStream
之后,会将其传入回调方法进行处理。
其中 callback
是在调用方法时传递进来的。而方法是在 SourceGenerator#startNext()
进行调用的。
// SourceGenerator.java
public boolean startNext() {
...
sourceCacheGenerator = null;
loadData = null;
boolean started = false;
while (!started && hasNextModelLoader()) {
// 1. 从 DecodeHelper 的数据加载集合中, 获取一个数据加载器
loadData = helper.getLoadData().get(loadDataListIndex++);
if (loadData != null
&& (helper.getDiskCacheStrategy().isDataCacheable(loadData.fetcher.getDataSource())
|| helper.hasLoadPath(loadData.fetcher.getDataClass()))) {
started = true;
// 2. 使用加载器中 fetcher 执行数据加载
// 加载网络的 url 资源对应的就是 HttpGlideUrlLoader,
// 它对应的 ModelLoader.L