美文网首页
Glide4.11的源码执行流程简析

Glide4.11的源码执行流程简析

作者: Alien的小窝 | 来源:发表于2021-01-21 12:53 被阅读0次

注:这里只是简略的流程,方便快速查找定位,更加具体的细节,只需要遇到问题的时候灵活运用断点定位即可
方法技巧:所有的源码均可以通过找到某个库最基础的使用方法,断点=> 开头和结尾,即可对清晰地看到整个源码的执行流程
想法和思考:不需要阅读网络上别人的源码剖析,我觉得想法和思考性的技巧更加重要,不管对于任何东西,当你遇到越来越多的东西之后,发现最重要的永远是"基本功"

ApplicationManager.getImageLoader().loadImage(imageUrl, imageView, 0);
ApplicationManager只是一个二次封装的管理类,真实加载管理是GlideImageLoaderImpl

com.bumptech.glide.RequestBuilder#into(android.widget.ImageView) {
    // 此处均为设置RequestBuilder的一系列参数
    RequestBuilder<Drawable> builder = requestManager.load(uri);
    builder.apply(requestOptions);
    // ...
    // 请求触发的地方
    builder.into(imageview);
    com.bumptech.glide.RequestBuilder#into(Y, com.bumptech.glide.request.RequestListener<TranscodeType>, com.bumptech.glide.request.BaseRequestOptions<?>, java.util.concurrent.Executor) {
        // 建立一个Request对象(包含线程池等,Target可以理解为ImageView的wrapper对象})
        Request request = buildRequest(target, targetListener, options, callbackExecutor);
        // ImageView的wrapper绑定request
        target.setRequest(request);
        // 发送网络请求
        requestManager.track(target, request);
        // 网络触发
        com.bumptech.glide.request.SingleRequest#begin
        com.bumptech.glide.request.SingleRequest#onSizeReady {
            engine.load {
                com.bumptech.glide.request.SingleRequest#onResourceReady(com.bumptech.glide.load.engine.Resource<?>, com.bumptech.glide.load.DataSource) {
                    if(targetListener != null) {
                        targetListener.onResourceReady
                    } else {
                        1. 含有自定义回调的 target.onResourceReady => 
                        com.douyou.libcommon.imageloader.glide.GlideImageLoaderImpl.BitmapTarget#onResourceReady {
                            // 自定义的回调如:ApplicationManager.getImageLoader().loadImage(imageView.getContext(),imageUrl, new SimpleImageLoadListener(){ ... }
                            listener.onLoadComplete(uri, null, resource)
                        }
                        2. 不含有自定义回调,Glide直接加载的 target.onResourceReady => 
                        com.bumptech.glide.request.target.ImageViewTarget#onResourceReady {
                            // Glide内部给ImageView设置资源
                            com.bumptech.glide.request.target.ImageViewTarget#setResourceInternal
                            com.bumptech.glide.request.target.DrawableImageViewTarget#setResource
                            view.setImageDrawable(resource);
                        }
                    }
                }
            }
        }

    }
}

上述流程 1 2 分叉点的规则见:

com.bumptech.glide.GlideContext#buildImageViewTarget

public class ImageViewTargetFactory {
  @NonNull
  @SuppressWarnings("unchecked")
  public <Z> ViewTarget<ImageView, Z> buildTarget(
      @NonNull ImageView view, @NonNull Class<Z> clazz) {
    if (Bitmap.class.equals(clazz)) {
      return (ViewTarget<ImageView, Z>) new BitmapImageViewTarget(view);
    } else if (Drawable.class.isAssignableFrom(clazz)) {
      return (ViewTarget<ImageView, Z>) new DrawableImageViewTarget(view);
    } else {
      throw new IllegalArgumentException(
          "Unhandled class: " + clazz + ", try .as*(Class).transcode(ResourceTranscoder)");
    }
  }
}

相关文章

网友评论

      本文标题:Glide4.11的源码执行流程简析

      本文链接:https://www.haomeiwen.com/subject/ghgrzktx.html