Glide源码解析02-load

来源:互联网 发布:linux查看实时日志命令 编辑:程序博客网 时间:2024/06/06 00:12

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流程图

0 0