文章基于Glide 4.9.0
上一篇我们了解到Glide.with返回的是一个RequestManager。这篇我们来接着看Glide.with(xxx).load(xxx)的load(xxx)方法。
public RequestBuilder<Drawable> load(@Nullable Bitmap bitmap) {
return asDrawable().load(bitmap);
}
public RequestBuilder<Drawable> load(@Nullable Drawable drawable) {
return asDrawable().load(drawable);
}
public RequestBuilder<Drawable> load(@Nullable String string) {
return asDrawable().load(string);
}
public RequestBuilder<Drawable> load(@Nullable Uri uri) {
return asDrawable().load(uri);
}
public RequestBuilder<Drawable> load(@Nullable Uri uri) {
return asDrawable().load(uri);
}
public RequestBuilder<Drawable> load(@RawRes @DrawableRes @Nullable Integer resourceId) {
return asDrawable().load(resourceId);
}
public RequestBuilder<Drawable> load(@Nullable byte[] model) {
return asDrawable().load(model);
}
public RequestBuilder<Drawable> load(@Nullable Object model) {
return asDrawable().load(model);
}
可以看到有N个重载,最后都是调用的asDrawable().load(xxx);其实用过的大家都应该知道,Glide还有对应的asBitmap(),asFile(),asGif()其实他们和asDrawable()一样,都是调用的下面这个方法。
public <ResourceType> RequestBuilder<ResourceType> as(
@NonNull Class<ResourceType> resourceClass) {
return new RequestBuilder<>(glide, this, resourceClass, context);
}
可以看到返回的是一个RequestBuilder。我们调用load(xxx)方法,其实调用的就是RequestBuilder的load(xxx)方法。我们先看RequestBuilder是个什么。
public class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>>
implements Cloneable,
ModelTypes<RequestBuilder<TranscodeType>> {
}
//再看看BaseRequestOptions
public abstract class BaseRequestOptions<T extends BaseRequestOptions<T>> implements Cloneable {
}
先大概的瞅一眼,RequestBuilder实现俩接口,继承BaseRequestOptions。
先看BaseRequestOptions,发现不少我们经常用的东西。比如error(xxx),override(int width, int height),isMemoryCacheable()。
再看实现的俩接口Cloneable,不用说,就是复制。ModelTypes,点进去一看,好嘛,这不就是load(xxx)方法的各种重载吗。不禁让我想到了接口的作用。
说回正题,看load(xxx)方法。
public RequestBuilder<TranscodeType> load(@Nullable Object model) {
return loadGeneric(model);
}
public RequestBuilder<TranscodeType> load(@Nullable Bitmap bitmap) {
return loadGeneric(bitmap)
.apply(diskCacheStrategyOf(DiskCacheStrategy.NONE));
}
public RequestBuilder<TranscodeType> load(@Nullable Drawable drawable) {
return loadGeneric(drawable)
.apply(diskCacheStrategyOf(DiskCacheStrategy.NONE));
}
public RequestBuilder<TranscodeType> load(@Nullable String string) {
return loadGeneric(string);
}
public RequestBuilder<TranscodeType> load(@Nullable Uri uri) {
return loadGeneric(uri);
}
public RequestBuilder<TranscodeType> load(@Nullable File file) {
return loadGeneric(file);
}
public RequestBuilder<TranscodeType> load(@RawRes @DrawableRes @Nullable Integer resourceId) {
return loadGeneric(resourceId).apply(signatureOf(ApplicationVersionSignature.obtain(context)));
}
public RequestBuilder<TranscodeType> load(@Nullable byte[] model) {
RequestBuilder<TranscodeType> result = loadGeneric(model);
if (!result.isDiskCacheStrategySet()) {
result = result.apply(diskCacheStrategyOf(DiskCacheStrategy.NONE));
}
if (!result.isSkipMemoryCacheSet()) {
result = result.apply(skipMemoryCacheOf(true /*skipMemoryCache*/));
}
return result;
}
可以看到返回loadGeneric(xxx),具体如下
@NonNull
private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
this.model = model;
isModelSet = true;
return this;
}
至此,load(xxx)方法就看完了,说白了就是标记起来传的是uri,url,file,bitmap等,同时传递了一些参数。
总结
load方法主要是用生成RequestBuilder,同时设置了一些参数。