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

503 阅读3分钟

简述

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映射表:

Model Data ModelLoader
Bitmap Bitmap UnitModelLoader
GifDecoder GifDecoder UnitModelLoader
File ByteBuffer ByteBufferFileLoader
File InputStream FileLoader
File ParcelFileDescriptor FileLoader
File File UnitModelLoader
int InputStream ResourceLoader
int ParcelFileDescriptor ResourceLoader
int AssetFileDescriptor ResourceLoader
int Uri ResourceLoader
Integer InputStream ResourceLoader
Integer ParcelFileDescriptor ResourceLoader
Integer Uri ResourceLoader
Integer AssetFileDescriptor ResourceLoader
String InputStream DataUrlLoader
Uri InputStream DataUrlLoader
String InputStream StringLoader
String ParcelFileDescriptor StringLoader
String AssetFileDescriptor StringLoader
Uri InputStream HttpUriLoader
Uri InputStream AssetUriLoader
Uri ParcelFileDescriptor AssetUriLoader
Uri InputStream MediaStoreImageThumbLoader
Uri InputStream MediaStoreVideoThumbLoader
Uri InputStream UriLoader
Uri ParcelFileDescriptor UriLoader
Uri AssetFileDescriptor UriLoader
Uri InputStream UrlUriLoader
URL InputStream UrlLoader
Uri File MediaStoreFileLoader
GlideUrl InputStream HttpGlideUrlLoader
byte[] ByteBuffer ByteArrayLoader
byte[] InputStream ByteArrayLoader
Uri Uri UnitModelLoader
Drawable Drawable UnitModelLoader

ResourceDecoder映射表:

Bucket Data Resource ResourceDecoder
"Bitmap" ByteBuffer Bitmap ByteBufferBitmapDecoder
"Bitmap" InputStream Bitmap StreamBitmapDecoder
"Bitmap" ParcelFileDescriptor Bitmap ResourceDecoder
"Bitmap" AssetFileDescriptor Bitmap VideoDecoder
"Bitmap" Bitmap Bitmap UnitBitmapDecoder
"Bitmap" GifDecoder Bitmap GifFrameResourceDecoder
"BitmapDrawable" ByteBuffer BitmapDrawable BitmapDrawableDecoder
"BitmapDrawable" InputStream BitmapDrawable BitmapDrawableDecoder
"BitmapDrawable" ParcelFileDescriptor BitmapDrawable BitmapDrawableDecoder
"Gif" InputStream GifDrawable StreamGifDecoder
"Gif" ByteBuffer GifDrawable ByteBufferGifDecoder
"legacy_append" Uri Drawable ResourceDrawableDecoder
"legacy_append" Uri Bitmap ResourceBitmapDecoder
"legacy_append" File File FileDecoder
"legacy_append" Drawable Drawable UnitDrawableDecoder

ResourceTranscoder映射表:

Resource Transcode ResourceTranscoder
Bitmap BitmapDrawable BitmapDrawableTranscoder
Bitmap byte[] BitmapBytesTranscoder
Drawable byte[] DrawableBytesTranscoder
GifDrawable byte[] GifDrawableBytesTranscoder

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