Glide Decode


在DecodeJob的onDataFetcherReady()方法,将成功Fetcher抓取的数据保存,准备解析。

this.currentData = data;
this.currentFetcher = fetcher;
this.currentDataSource = dataSource;

将Object类型的数据转换成Resource类型。

Data 处理流程

经过三个步骤,ResourceDecoder,Transformation 和 ResourceTranscoder 处理。

资源包装接口
Resource,Resource.get()方法,返回T类型对象,如 Bitmap。

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工厂,注册类包含工厂集合。InputStream和ByteBuffer类型有特定的DataRewinder工厂,其他选择默认DataRewinder工厂,
DataRewinder接口是对不同类型数据的统一封装,使用时rewindAndGet()方法,获得DataRewinder的T数据,包括InputStream和ByteBuffer,以及Uri和File,它们来自DefaultRewinder。

一、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 接口。数据源 T,目标 Z,12个子类。
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图片资源数据BitmapDrawable,Bitmap,Drawable,GifDrawable,以及File。

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 的 ResourceType 类型。

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>,类型:Resource
包含三个子类。

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方法,入参:类型,如InputStream,ByteBuffer,Resource,Resource
将data,缓存到file文件

编码策略:EncodeStrategy
1,TRANSFORMED
2,SOURCE
3,NONE


任重而道远

你可能感兴趣的:(Glide Decode)