Glide v4 源码浅析(2)-load方法与Registry说明


简述

Glide图片加载框架通过load方法设置数据源,本篇延续《Glide v4 源码浅析(1)-with》中的例子,继续分析在load方法中做了什么操作。

源码分析

RequestBuilder构建

Glide首先通过with方法获取RequestManager对象,然后调用RequestManager的load方法设置数据源。

load方法有多个重载,对应加载不同的数据源:

这里以传入一个"http://xxxx"的url为例:

@NonNull
@CheckResult
@Override
public RequestBuilder<Drawable> load(@Nullable String string) {
  return asDrawable().load(string);
}

先看asDrawable方法:

@NonNull
@CheckResult
public RequestBuilder<Drawable> asDrawable() {
  return as(Drawable.class);
}

@NonNull
@CheckResult
public <ResourceType> RequestBuilder<ResourceType> as(
    @NonNull Class<ResourceType> resourceClass) {
  return new RequestBuilder<>(glide, this, resourceClass, context);
}

该方法最终new了一个RequestBuilder对象。RequestBuilder的作用是收集参数和创建Request。

asDrawable方法返回RequestBuilder后,接着调用它的load方法传入图片url:

@NonNull
@Override
@CheckResult
public RequestBuilder<TranscodeType> load(@Nullable String string) {
  return loadGeneric(string);
}

@NonNull
private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
  // model成员变量保存数据源,本例中即图片url
  this.model = model;
  // isModelSet标识置为true,表示已设置数据源
  isModelSet = true;
  return this;
}

可以看到load方法主要就是创建返回RequestBuilder,并设置了数据源等参数。

(ps:本例中创建的RequestBuilder中的modelClass为String.class,transcodeClass为Drawable.class,后续加载流程会根据这些类型从注册表中查找对应的编解码工具类进行处理。)

Registry注册表补充说明

Glide框架中有一个Registry类,在Glide初始化时注册了一系列的编解码器、转换器、解析器等工具类。在后续加载图片流程中,Glide会根据数据源参数类型和需要转换成的资源类型等从Registry中匹配合适的工具类来进行处理。

public Registry() {
  this.modelLoaderRegistry = new ModelLoaderRegistry(throwableListPool);
  this.encoderRegistry = new EncoderRegistry();
  this.decoderRegistry = new ResourceDecoderRegistry();
  this.resourceEncoderRegistry = new ResourceEncoderRegistry();
  this.dataRewinderRegistry = new DataRewinderRegistry();
  this.transcoderRegistry = new TranscoderRegistry();
  this.imageHeaderParserRegistry = new ImageHeaderParserRegistry();
  setResourceDecoderBucketPriorityList(
      Arrays.asList(BUCKET_GIF, BUCKET_BITMAP, BUCKET_BITMAP_DRAWABLE));
}

Registry包含7个子注册表,它会将注册进来的工具类分发到对应的子注册表中保存:

  • ModelLoaderRegistry:注册指定<Model>和<Data>对应的ModelLoaderFactory。ModelLoaderFactory负责创建ModelLoader,而ModelLoader中处理从model到data的过程。
  • EncoderRegistry:注册<Data>对应的Encoder。Encoder负责将data写入本地持久化存储。
  • ResourceDecoderRegistry:注册<Data>和<Resource>对应的ResourceDecoder。ResourceDecoder负责从data解码成resource。
  • ResourceEncoderRegistry:注册<Resource>对应的ResourceEncoder。ResourceEncoder负责将resource写入本地持久化存储。
  • DataRewinderRegistry:注册DataRewinder.Factory。DataRewinder.Factory负责创建DataRewinder,而DataRewinder中处理将包装的数据流重置到原始位置并返回。
  • TranscoderRegistry:注册<Resource>和<Transcode>对应的ResourceTranscoder。ResourceTranscoder负责从resource转码成transcodeResource。
  • ImageHeaderParserRegistry:注册ImageHeaderParser。ImageHeaderParser负责解析图像信息。

<Model>表示数据源参数的类型,例如本例的图片url为String以及其他File、Uri、int等。
<Data>表示从model加载来的数据流类型,例如InputStream、FileDescriptor等。
<Resource>表示解码后的资源类型,例如Bitmap、Drawable等。
<Transcode>表示转码后的资源类型,例如BitmapDrawable、byte[]等。

ModelLoader映射表:

ModelDataModelLoader
BitmapBitmapUnitModelLoader
GifDecoderGifDecoderUnitModelLoader
FileByteBufferByteBufferFileLoader
FileInputStreamFileLoader
FileParcelFileDescriptorFileLoader
FileFileUnitModelLoader
intInputStreamResourceLoader
intParcelFileDescriptorResourceLoader
intAssetFileDescriptorResourceLoader
intUriResourceLoader
IntegerInputStreamResourceLoader
IntegerParcelFileDescriptorResourceLoader
IntegerUriResourceLoader
IntegerAssetFileDescriptorResourceLoader
StringInputStreamDataUrlLoader
UriInputStreamDataUrlLoader
StringInputStreamStringLoader
StringParcelFileDescriptorStringLoader
StringAssetFileDescriptorStringLoader
UriInputStreamHttpUriLoader
UriInputStreamAssetUriLoader
UriParcelFileDescriptorAssetUriLoader
UriInputStreamMediaStoreImageThumbLoader
UriInputStreamMediaStoreVideoThumbLoader
UriInputStreamUriLoader
UriParcelFileDescriptorUriLoader
UriAssetFileDescriptorUriLoader
UriInputStreamUrlUriLoader
URLInputStreamUrlLoader
UriFileMediaStoreFileLoader
GlideUrlInputStreamHttpGlideUrlLoader
byte[]ByteBufferByteArrayLoader
byte[]InputStreamByteArrayLoader
UriUriUnitModelLoader
DrawableDrawableUnitModelLoader

ResourceDecoder映射表:

BucketDataResourceResourceDecoder
“Bitmap”ByteBufferBitmapByteBufferBitmapDecoder
“Bitmap”InputStreamBitmapStreamBitmapDecoder
“Bitmap”ParcelFileDescriptorBitmapResourceDecoder
“Bitmap”AssetFileDescriptorBitmapVideoDecoder
“Bitmap”BitmapBitmapUnitBitmapDecoder
“Bitmap”GifDecoderBitmapGifFrameResourceDecoder
“BitmapDrawable”ByteBufferBitmapDrawableBitmapDrawableDecoder
“BitmapDrawable”InputStreamBitmapDrawableBitmapDrawableDecoder
“BitmapDrawable”ParcelFileDescriptorBitmapDrawableBitmapDrawableDecoder
“Gif”InputStreamGifDrawableStreamGifDecoder
“Gif”ByteBufferGifDrawableByteBufferGifDecoder
“legacy_append”UriDrawableResourceDrawableDecoder
“legacy_append”UriBitmapResourceBitmapDecoder
“legacy_append”FileFileFileDecoder
“legacy_append”DrawableDrawableUnitDrawableDecoder

ResourceTranscoder映射表:

ResourceTranscodeResourceTranscoder
BitmapBitmapDrawableBitmapDrawableTranscoder
Bitmapbyte[]BitmapBytesTranscoder
Drawablebyte[]DrawableBytesTranscoder
GifDrawablebyte[]GifDrawableBytesTranscoder

以上表格中的类是glide初始化注册表时注册的,支持表格中的数据类型处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值