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/
- 图非常好,非常清晰。本文部分图片参考该文