Glide源码解析02-load
最简单的Glide调用,如下所示,下面将根据Glide的调用顺序,进行源码解析。
Glide.with(this)
.load(uri)
.into(img);
load方法
从上一步with中,我们得到了RequestManager对象,下面再来看RequestManager#load方法。
load方法也有很多重载,比如Sting、Uri、File、Integer等。
简析
load方法主要是创建DrawableTypeRequest,并将记录相关的uri等数据供后续使用。
详情
以下以String的重载为例。
2.0 RequestManager#load()
load方法的内部先会调用fromString(),获取到DrawableTypeRequest后,再调用其DrawableTypeRequest#load()。
public DrawableTypeRequest<String> load(String string) {
return (DrawableTypeRequest<String>) fromString().load(string);
}
2.1 fromString()
fromString()中,直接调用了loadGeneric(),并传入了String.class 这个参数。
public DrawableTypeRequest<String> fromString() {
return loadGeneric(String.class);
}
2.2 loadGeneric()
在loadGeneric()中,调用了Glide.buildStreamModeLoader和Glide.buildFileDescriptorModeLoader来获取ModelLoader对象。
ModelLoader对象用于加载图片,内部有一个getResourceFetcher()方法,用于获取DataFetcher对象,DataFetcher是用于从网络,磁盘等地方获取图片的,这个在后续中会用到。
之后,会new一个DrawableTypeRequest对象并把streamModelLoader和fileDescriptorModelLoader都传入。
DrawableTypeRequest提供asBitmap和asGif的这两个方法,分别用于强制加载静态图片和动态图片。
最后调用RequestManager#optionsApplier.apply将DrawableTypeRequest赋值给相关字段。
private <T> DrawableTypeRequest<T> loadGeneric(Class<T> modelClass) {
ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(modelClass, context);
ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader =
Glide.buildFileDescriptorModelLoader(modelClass, context);
//...
return optionsApplier.apply(
new DrawableTypeRequest<T>(modelClass, streamModelLoader, fileDescriptorModelLoader, context,
glide, requestTracker, lifecycle, optionsApplier));
}
回到 2.0,我们再来看DrawableTypeRequest.load()
2.3 DrawableTypeRequest.load()
DrawalbeTypeRequest.load()直接调用了其父类的load()
在父类GenericRequestBuilderload()中,仅将参数进行了记录。
GenericRequestBuilder#load()
public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> load(ModelType model) {
this.model = model;
isModelSet = true;
return this;
}
至此,完成了load()方法的全部调用,并返回了GenericRequestBuilder(或其子类)对象。
更多
Glide源码解析01-with
Glide源码解析02-load
Glide源码解析03-into
Glide源码解析04-decode
Glide源码解析05-onLoadComplete
Glide源码解析06-Glide流程图