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

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初始化註冊表時註冊的,支持表格中的數據類型處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章