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

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

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

GlideContext.buildImageViewTarget

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

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

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

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

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

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

private > Y into(Y target,RequestListener 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 方法发起加载请求)