上面一篇我们讲了Glide的with方法,没有看的请戳Glide源码解析(一), 这篇我们来看Glide的load方法,with方法返回的是一个GlideRequests,那么load肯定是在这个类里面,GlideRequests继承自RequestManager(管理和请求Glide的请求类,可以通过Activity和Fragment的生命周期自动停止和从起请求)。接下来我们看load方法,GlideRequests中load方法有很多个:
public GlideRequest<Drawable> load(@Nullable Bitmap arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@NonNull
@CheckResult
public GlideRequest<Drawable> load(@Nullable Drawable arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@NonNull
@CheckResult
public GlideRequest<Drawable> load(@Nullable String arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@NonNull
@CheckResult
public GlideRequest<Drawable> load(@Nullable Uri arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@NonNull
@CheckResult
public GlideRequest<Drawable> load(@Nullable File arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@NonNull
@CheckResult
public GlideRequest<Drawable> load(@Nullable Integer arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@Deprecated
@CheckResult
public GlideRequest<Drawable> load(@Nullable URL arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@NonNull
@CheckResult
public GlideRequest<Drawable> load(@Nullable byte[] arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
@Override
@NonNull
@CheckResult
public GlideRequest<Drawable> load(@Nullable Object arg0) {
return (GlideRequest<Drawable>) super.load(arg0);
}
相比于3.v的load(Object o)对参数进行了区分,跟踪接入任意的load方法形式其实都差不多,那么我们选择其中一个如下,其他方法只有参数不同:
public RequestBuilder<Drawable> load(@Nullable Uri uri) {
return asDrawable().load(uri);
}
其中asDrawable()是用已经注册的ResourceDecoder来加载资源,解码Drawable的任何子类。默认情况下返回泛型为BitmapDrawable或者GifDrawable的RequestBuilder。RequestBuilder中的load方法如下:
public RequestBuilder<TranscodeType> load(@Nullable Uri uri) {
return loadGeneric(uri);
}
继续跟踪到loadGeneric里面:
private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
this.model = model;
isModelSet = true;
return this;
}
通过isModelSet来判断load方法是否被调用,那为什么不直接判断model是否为null呢?类中已经给了解释:
那么接下来,我们看model用在什么地方呢?
private Request obtainRequest(
Target<TranscodeType> target,
RequestListener<TranscodeType> targetListener,
RequestOptions requestOptions,
RequestCoordinator requestCoordinator,
TransitionOptions<?, ? super TranscodeType> transitionOptions,
Priority priority,
int overrideWidth,
int overrideHeight) {
return SingleRequest.obtain(
context,
glideContext,
model,
transcodeClass,
requestOptions,
overrideWidth,
overrideHeight,
priority,
target,
targetListener,
requestListener,
requestCoordinator,
glideContext.getEngine(),
transitionOptions.getTransitionFactory());
}
当然啦,这个方法是在into方法中调用的,所以放到下篇说啦,好滴,load()方法是不是要简单些呢,哈哈~~咪揪,下篇见Glide源码解析(三)