美文网首页
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