书接上文,上回书说到GlideAPP和.with()方法背后的故事,那么我们接着按照我们开始的思路,按照Glide基本加载步骤中的三步走,with(),load(),into(),今天
我们来介绍一下load()方法。
通过上一篇文章Glide4.0源码全解析(一),GlideAPP和.with()方法背后的故事
我们可以知道.with()方法返回的是GlideRequests对象,
/**
* @see Glide#with(Activity)
*/
public static GlideRequests with(Activity activity) {
return (GlideRequests) Glide.with(activity);
}那么我们想要了解的.load()一定是在 GlideRequests类里面,那么先来看一下GlideRequests这个类:
public class GlideRequests extends RequestManager {
...
...
...
}GlideRequests是继承自RequestManager(负责管理和请求Glide的请求类,后面再详细讲解)。
GlideRequests中有如下方法:

总共有9个方法,其他的方法暂时先不去分析,我们先去分析一下我们的load(Object arg0)方法。
该方法调用的是父类的super.load(arg0)返回的是GlideRequest对象。
那么我们去RequestManager(上门提过)看一下里面的load(arg0)方法。
先来看一下RequestManager API: Class RequestManager API
/**
*用于管理和启动Glide请求的类。可以使用activity、fragment和连接生命周期事件来智能地停止、
*启动和重启请求。通过实例化一个新对象,或者利用在Fragment和Activity生命周期处理中构建的
*优势,可以在Fragment或者Activity使用静态的Glide.load方法
*/
public class RequestManager implements LifecycleListener {
/**
* 一个helper方法,相当于调用asDrawable()
*
* @return 返回一个新的给定model的request builder
*/
public RequestBuilder<Drawable> load(@Nullable Object model) {
return asDrawable().load(model);
}
/**
*默认情况下,可以返回一个BitmapDrawable或GifDrawable,但是如果对其他可绘制的子类注册了
*额外的解码器,那么这些子类也可以返回。
*/
public RequestBuilder<Drawable> asDrawable() {
return as(Drawable.class);
}
/**
*尝试使用仍和注册的资源去解码给定的类或子类
*@param resourceClass 需要解码的资源
*@return 一个新的加载给定资源类的request builder
*/
public <ResourceType> RequestBuilder<ResourceType> as(Class<ResourceType> resourceClass) {
return new RequestBuilder<>(glide, this, resourceClass);
}
}也就是说我们在调用.load(args)时候,Glide默认帮我们执行了asDrawable()方法,asDrawable()实际执行的是as(Drawable.class),最终as(Class<ResourceType> resourceClass)返回一个RequestBuilder<>(glide, this, resourceClass);。
到这里我们只是创建了一个RequestBuilder,然后我们去看
public RequestBuilder<Drawable> load(@Nullable Object model) {
return asDrawable().load(model);
}中的.load(model)做了什么?
既然asDrawable()返回RequestBuilder对象,那么我们就去RequestBuilder类中一探究竟。
老规矩,先来看一下RequestBuilder API: RequestBuilder API
/**
* 设置要加载数据的特定模型
*
* 这个方法至少要调用一次
*/
@SuppressWarnings("unchecked")
public RequestBuilder<TranscodeType> load(@Nullable Object model) {
return loadGeneric(model);
}
private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
this.model = model;
isModelSet = true;
return this;
}上面的方法我们看到load(我们传入特定的modle) 到这里你可能会疑问:为什么必须至少调用一次load()方法?传入的model在哪里使用的?
load()方法?其实不用看代码,想象都明白,你不传入资源文件,Glide为我们加载什么东西?

如上图,源码注释中也说道了,不过就算你不调用load()方法也不会出问题,因为isModelSet参数就是用来判断是否调用了load()方法,Glide已经帮我们处理好了。
如图:

所以保证了不会crash。
model在哪里使用的?传入的model会在最后的into()方法中去使用,
public <Y extends Target<TranscodeType>> Y into(@NonNull Y target) {
...
Request request = buildRequest(target);
...
}
private Request buildRequest(Target<TranscodeType> target) {
return buildRequestRecursive(target, null, transitionOptions, requestOptions.getPriority(),
requestOptions.getOverrideWidth(), requestOptions.getOverrideHeight());
}
private Request buildRequestRecursive(Target<TranscodeType> target,
@Nullable ThumbnailRequestCoordinator parentCoordinator,
TransitionOptions<?, ? super TranscodeType> transitionOptions,
Priority priority, int overrideWidth, int overrideHeight) {
...
Request fullRequest = obtainRequest(target, requestOptions, coordinator, transitionOptions,
priority, overrideWidth, overrideHeight);
RequestOptions thumbnailOptions = requestOptions.clone()
.sizeMultiplier(thumbSizeMultiplier);
Request thumbnailRequest = obtainRequest(target, thumbnailOptions, coordinator,
transitionOptions, getThumbnailPriority(priority), overrideWidth, overrideHeight);
...
}
private Request obtainRequest(Target<TranscodeType> target,
RequestOptions requestOptions, RequestCoordinator requestCoordinator,
TransitionOptions<?, ? super TranscodeType> transitionOptions, Priority priority,
int overrideWidth, int overrideHeight) {
requestOptions.lock();
return SingleRequest.obtain(
context,
model,
transcodeClass,
requestOptions,
overrideWidth,
overrideHeight,
priority,
target,
requestListener,
requestCoordinator,
context.getEngine(),
transitionOptions.getTransitionFactory());
}以上部分代码已经精简过来,关于into()方法本章先不介绍,下一篇将详细介绍。
到这里 .load()方法已经基本结束了。
这里只介绍了load(@Nullable Object model),总共有七个,原理都是一样的,这里就不挨着介绍了。


好了 .load(),还是比较简单的,下一篇会继续我们的三步走,讲解.into()方法。