美文网首页
Glide 图片加载库源码分析4-into 方法发起加载请求

Glide 图片加载库源码分析4-into 方法发起加载请求

作者: jkwen | 来源:发表于2021-07-12 22:09 被阅读0次

    通过 load 方法得到了 GlideRequest 对象,GlideRequest 类也是编译生成的,它的作用更多的是提供一些可选配置,实际执行还要看 RequestBuilder 对象的 into 方法,

    public ViewTarget<ImageView, TranscodeType> into(@NonNull ImageView view) {
        BaseRequestOptions<?> requestOptions = this;
        //省略部分代码......
        return into(glideContext.buildImageViewTarget(view, transcodeClass),null,requestOptions,Executors.mainThreadExecutor());
    }
    

    GlideContext.buildImageViewTarget

    这里重点看下 glideContext 的 buildImageViewTarget 方法,

    public <X> ViewTarget<ImageView, X> buildImageViewTarget(ImageView imageView,Class<X> transcodeClass) {
        return imageViewTargetFactory.buildTarget(imageView, transcodeClass);
    }
    

    按前面的分析,两个入参类型分别是 ImageView 和 Drawable。imageViewTargetFactory 会在创建 GlideContext 对象是传入赋值,

    public class ImageViewTargetFactory {
        public <Z> ViewTarget<ImageView, Z> buildTarget(ImageView view,Class<Z> clazz) {
            if (Drawable.class.isAssignableFrom(clazz)) {
                return (ViewTarget<ImageView, Z>) new DrawableImageViewTarget(view);
            }
        }
    }
    

    所以这里最终创建的对象类型是 DrawableImageViewTarget,类似的还有 BitmapImageViewTarget。

    回到前面的 into 方法继续往下看,

    private <Y extends Target<TranscodeType>> Y into(Y target,RequestListener<TranscodeType> targetListener,BaseRequestOptions<?> options,Executor callbackExecutor) {
        Request request = buildRequest(target, targetListener, options, callbackExecutor);
        Request previous = target.getRequest();
        if (request.isEquivalentTo(previous) && !isSkipMemoryCacheWithCompletePreviousRequest(options, previous)) {
            //省略......
            return target;
        }
        requestManager.clear(target);
        target.setRequest(request);
        requestManager.track(target, request);
        return target;
    }
    

    看到这个方法我感觉被 Glide 所蒙蔽了。前面对比过 Glide 与 Picasso 的调用过程,以为 Glide 请求的创建于发起是分开的,但其实好像也是放在一起的。

    方法的大致逻辑是 1. 利用入参创建请求对象 request。2. 校验相同 target 是否已有请求,有的话不会再发起。3. 发起请求。

    总结一下,Glide 调用的最后一步 into 方法的主要工作依然是创建真正的加载请求并发起请求。这样来看 Glide 和 Picasso 相似度又增加了。前面的 with 和 load 方法其实都是为了请求而做的准备,特别是利用了 APT 来实现自定义选项的配置。

    相关文章

      网友评论

          本文标题:Glide 图片加载库源码分析4-into 方法发起加载请求

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