在DecodeJob的onDataFetcherReady()方法,将成功Fetcher抓取的数据保存,准备解析。
this.currentData = data;
this.currentFetcher = fetcher;
this.currentDataSource = dataSource;
将Object类型的数据转换成Resource
经过三个步骤,ResourceDecoder,Transformation 和 ResourceTranscoder 处理。
资源包装接口
Resource
index | Resource |
类 |
---|---|---|
1 | Resource |
BitmapResource |
2 | Resource |
FileResource |
3 | Resource |
DrawableResource |
4 | Resource |
LazyBitmapDrawableResource |
5 | Resource |
GifDrawableResource继承DrawableResource |
6 | Resource |
BytesResource |
DataRewinder,原数据包装接口。
index | DataRewinder | 工厂 | 包装的类型 |
---|---|---|---|
1 | InputStreamRewinder | InputStreamRewinder.Factory | InputStream |
2 | ByteBufferRewinder | ByteBufferRewinder.Factory | ByteBuffer |
3 | DefaultRewinder | 默认工厂.Factory | Object |
DataRewinderRegistry 注册。
根据Data的Class类型,选择DataRewinder.Factory
DataRewinder接口是对不同类型数据的统一封装,使用时rewindAndGet()方法,获得DataRewinder
一、Decode 流程
private Resource decodeFromFetcher(Data data, DataSource dataSource)
throws GlideException {
LoadPath path = decodeHelper.getLoadPath((Class) data.getClass());
return runLoadPath(data, dataSource, path);
}
根据Data(Object)的Class类型,查找LoadPath,getLoadPath()方法,根据dataClass、resourceClass和transcodeClass,创建LoadPath,执行runLoadPath()方法。
private Resource runLoadPath(Data data, DataSource dataSource,
LoadPath path) throws GlideException {
Options options = getOptionsWithHardwareConfig(dataSource);
DataRewinder rewinder = glideContext.getRegistry().getRewinder(data);
try {
return path.load(
rewinder, options, width, height, new DecodeCallback(dataSource));
} finally {
rewinder.cleanup();
}
}
Data包装DataRewinder,LoadPath的load()方法,遍历内部DecodePath列表,decode()方法。
public Resource decode(DataRewinder rewinder, int width, int height,
Options options, DecodeCallback callback) throws GlideException {
Resource decoded = decodeResource(rewinder, width, height, options);
Resource transformed = callback.onResourceDecoded(decoded);
return transcoder.transcode(transformed, options);
}
遍历DecodePath内ResourceDecoder列表,查找匹配ResourceDecoder,将数据转换Resource
在onResourceDecoded()进行Transformation变换处理。
最后ResourceTranscoder处理。
二、DecodePath 构建
getDecodePaths() 方法,返回 DecodePath 列表。
注册类,ResourceDecoderRegistry,TranscoderRegistry。
根据 数据源和目标类 ,和子类 isAssignableFrom() 。ResourceDecoderRegistry 目标列表查询。在 RequestOptions 类 默认的目标类型 resourceClass 是 Object 类。
所有支持的 resourceClass 类型列表。
针对每一项支持的 resourceClass,和 需求 transcodeClass。
TranscoderRegistry类,查询可支持的 registeredTranscodeClass 转换列表。
这样,只要从 dataClass 到 resourceClass ,再到 transcodeClass,都可匹配,就是一条完整解析通道。
dataClass,每一项 resourceClass,对应 ResourceDecoder。
每一项 resourceClass,每一项 transcodeClass,对应 ResourceTranscoder。
DecodePath 全路径包括
dataClass,resourceClass,registeredTranscodeClass,ResourceDecoder 列表,ResourceTranscoder。
因此,构建 DecodePath 对象。
三、ResourceDecoder 解码
资源解码器 ResourceDecoder
Z是 Resource
index | T 数据源 | Z 目标类型 | ResourceDecoder | 说明 |
---|---|---|---|---|
1 | DataType | Bitmap | BitmapDrawableDecoder | 内部装饰者 |
2 | ByteBuffer | Bitmap | ByteBufferBitmapDecoder | Downsampler处理 |
3 | InputStream | Bitmap | StreamBitmapDecoder | Downsampler处理 |
4 | ParcelFileDescriptor | Bitmap | VideoDecoder | |
5 | AssetFileDescriptor | Bitmap | VideoDecoder | |
6 | Uri | Drawable | ResourceDrawableDecoder | Uri转换resId |
7 | Uri | Bitmap | ResourceBitmapDecoder | 装饰者 |
8 | File | File | FileDecoder | 直接包装生成FileResource |
9 | Drawable | Drawable | UnitDrawableDecoder | NonOwnedDrawableResource |
10 | Bitmap | Bitmap | UnitBitmapDecoder | NonOwnedBitmapResource |
11 | ByteBuffer | GifDrawable | ByteBufferGifDecoder | GifDrawableResource |
12 | InputStream | GifDrawable | StreamGifDecoder | GifDrawableResource |
13 | GifDecoder | Bitmap | GifFrameResourceDecoder |
将T类型数据,转换成Resource
handle()方法,匹配data是ResourceDecoder支持的类型,decode()方法,解析,从包装DataRewinder类获取源数据,提供给ResourceDecoder。
解析成功,各类型源数据,封装Resource
DecodePath.DecodeCallback接口回调,onResourceDecoded()方法,通知资源解析成功,交给DecodeJob的onResourceDecoded()方法Transformation类处理。
DeferredEncodeManager初始化encode内容。
四、Transformation 变换
Transformation 类 transform() 方法,图片资源变换,生成一个 Resource
index | Transformation | 处理类型 |
---|---|---|
1 | BitmapTransformation (抽象) | Bitmap |
2 | DrawableTransformation | Drawable |
3 | BitmapDrawableTransformation | BitmapDrawable |
4 | GifDrawableTransformation | GifDrawable |
5 | MultiTransformation | 内部 Transformation 集合 |
6 | UnitTransformation | 不处理 |
子类重写 transform() 方法,不改变 Resource
BitmapTransformation (抽象类) 子类,都是对 Bitmap 的变换。
CenterCrop,CenterInside,CircleCrop,FitCenter,RoundedCorners。
五、ResourceTranscoder 转换
资源类型转换。
index | Z 源 | R 目标 | Transcoder |
---|---|---|---|
1 | Bitmap | BitmapDrawable | BitmapDrawableTranscoder |
2 | Bitmap | byte[] | BitmapBytesTranscoder |
3 | Drawable | byte[] | DrawableBytesTranscoder |
4 | GifDrawable | byte[] | GifDrawableBytesTranscoder |
5 | Z | Z | UnitTranscoder 不改变 |
Resource
目标类型,即 GlideRequest 构造方法 transcodeClass,即 as() 方法参数。
as() 方法支持类型包括 Bitmap,Drawable,GifDrawable,File,
如果用途是为了显示在 ImageView,仅支持目标类型 Bitmap 和 Drawable ,GifDrawable,转换目的是适配上层要求( as() 方法)的图片类型。
六、Encoder 持久化缓存
Resource 资源通知
上层转换成功,将 Resource<> 结果交给 notifyEncodeAndRelease() 方法。
1,notifyEncodeAndRelease()方法,通知。
任务状态Stage.ENCODE
notifyComplete()通知结束,DecodeJob.Callback回调onResourceReady(),即回到EngineJob。
通过EngineJob的onResourceReady()回调方法,资源数据Resource>存储。发送消息进入主线程,handleResultOnMainThread()处理。
cbs集合回调,SingleRequest实现了ResourceCallback接口,触发Target的onResourceReady()方法。
2,持久化 DeferredEncodeManager 处理,encode() 方法。
Encoder接口
定义encode()方法,将Data类型数据解析到File。
ResourceEncoder,Encoder
包含三个子类。
index | Encoder | 解析类型 | 策略 | 说明 |
---|---|---|---|---|
1 | ByteBufferEncoder | ByteBuffer | EncoderRegistry 注册 | |
2 | StreamEncoder | InputStream | EncoderRegistry 注册 | |
3 | BitmapEncoder | Resource |
TRANSFORMED | |
4 | BitmapDrawableEncoder | Resource |
TRANSFORMED | 装饰者 |
5 | GifDrawableEncoder | Resource |
SOURCE | Gif |
前两者 父类, Encoder。
后三者父类,ResourceEncoder
boolean encode(@NonNull T data, @NonNull File file, @NonNull Options options);
encode方法,入参:
将data,缓存到file文件
编码策略:EncodeStrategy
1,TRANSFORMED
2,SOURCE
3,NONE
任重而道远