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