1. 整體轉化過程
1.1 轉化過程說明
- Model經過ModelLoader處理轉化爲DataClass(eg:Url->Bitmap)
- DataClass經過ResourceDecoder轉化爲Resource(eg:
Bitmap->Resource<BitmapDrawable>
) - Resource經過Transformation轉化爲TransformedResource(eg:轉化爲圓角或者圓形)
- TransformsResource經過Encoder轉化爲LocalCache(eg:將Bitmap轉化存儲在本地磁盤上面)
其中第三步Resource轉化爲TransformedResource之後就會回調給Engine,然後切換到主線程,將Resource綁定到TargetView上面。詳細過程參見:【Glide總體流程概覽】
同時,會通過Encoder將transformedResource轉化爲數據存儲在磁盤裏面,方便下次直接從磁盤之中讀取緩存數據。Encoder實現細節參見:【3.3 Encoder】
1.2 轉化過程實例
給定如下的示例代碼:
RequestOptions options = new RequestOptions();
options.centerCrop()
.diskCacheStrategy(DiskCacheStrategy.ALL);
Glide.with(mContext)
.load(url1)
.apply(options)
.into(imageView);
其Model轉化爲LocalCache的過程如下:
url--(ByteBufferFileLoader)-->ByteBuffer--(ByteBufferBitmapDecoder)
-->Resource<BitmapResource>--(CenterCrop)-->Resource<BitmapResource>
--(BitmapEncoder)-->File
2. 實現過程概覽
下圖是Glide實現上述轉化過程的流程圖,其包含了轉化過程關鍵步驟和關鍵的操作,具體源碼的實現,可參照下圖自己去看,收穫可能更大一些。
(1)說明:
- 綠色部分的角色代表上圖裏面各個轉化器
- 橙色部分代表數據類型發生轉化的地方
(2)關鍵類說明
- DecodeJob:整個轉化的過程均在DecodeJob之中完成
- ModelLoader:將Model轉化爲DataClass
- 依賴Fetcher來完成數據的獲取
- LoadPath:將DataClass轉化爲Resource
- 依賴DecodePath
- DecodePath:執行DataClass->Resource->transformedResource
- 依賴ResourceDecoder
- 依賴Transformation
3. 上述關鍵類的實例簡述
3.1 ModelLoader
ModelLoader的實例:
3.2 Resource
Resource的實例:
3.3 Transformation
3.4 Encoder
Encoder的實例:
參考文獻
- GlideV4源碼分析:http://www.lightskystreet.com/2015/10/12/glide_source_analysis/
- 圖非常好,非常清晰。本文部分圖片參考該文