【笔记整理】Glide 4.9.0 关于数据加载之后的回调过程

当 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值