GlideV4 Model轉化爲Resource的過程

1. 整體轉化過程

1.1 轉化過程說明

這裏寫圖片描述

  1. Model經過ModelLoader處理轉化爲DataClass(eg:Url->Bitmap)
  2. DataClass經過ResourceDecoder轉化爲Resource(eg:Bitmap->Resource<BitmapDrawable>
  3. Resource經過Transformation轉化爲TransformedResource(eg:轉化爲圓角或者圓形)
  4. 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的實例:

參考文獻

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