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的实例:

参考文献

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