当前位置: 首页 > news >正文

【Android】Glide模块工作原理

Glide模块工作原理

每个Glide模块包含一个Decoder,和一个Transcoder

Decoder负责将DataSource转换为对应的Resource

Transcoder负责将对应的Resource,转换为Drawable

GlideModule示例

这里以SVG为例,展示下GlideModule是如何定义的

class SvgDecoder : ResourceDecoder<InputStream, SVG> {override fun handles(source: InputStream, options: Options): Boolean {return true}override fun decode(source: InputStream, width: Int, height: Int, options: Options): Resource<SVG>? {try {val svg = SVG.getFromInputStream(source)if (width != Target.SIZE_ORIGINAL)svg.documentWidth = width.toFloat()if (height != Target.SIZE_ORIGINAL)svg.documentHeight = height.toFloat()return SimpleResource(svg)} catch (e: Throwable) {return null}}
}
class SvgTranscoder : ResourceTranscoder<SVG, PictureDrawable> {override fun transcode(toTranscode: Resource<SVG>, options: Options): Resource<PictureDrawable> {val svg = toTranscode.get()val picture = svg.renderToPicture()val drawable = PictureDrawable(picture)return SimpleResource(drawable)}
}
@GlideModule
class SvgLibraryGlideModule : LibraryGlideModule() {override fun registerComponents(context: Context, glide: Glide, registry: Registry) {registry.register(SVG::class.java, PictureDrawable::class.java, SvgTranscoder())registry.append(InputStream::class.java, SVG::class.java, SvgDecoder())}
}
Decode流程

Glide的加载原理,是采用HitTest的方法

轮询所有注册的Decoder,挨个尝试解码DataSource

如果解码成功,则视为该Decoder对应的Resource

再找到Decoder对应的Transcoder,将对应的Resource转为Drawable

这样,便可以将对应资源加载到ImageView当中了

class DecodePath {private Resource<ResourceType> decodeResourceWithList(DataRewinder<DataType> rewinder,int width,int height,Options options,List<Throwable> exceptions) {Resource<ResourceType> result = null;// hit test decoderfor (int i = 0, size = decoders.size(); i < size; i++) {ResourceDecoder<DataType, ResourceType> decoder = decoders.get(i);try {DataType data = rewinder.rewindAndGet();if (decoder.handles(data, options)) {data = rewinder.rewindAndGet();result = decoder.decode(data, width, height, options);}} catch (Throwable e) {Log.v(TAG, "Failed to decode data for " + decoder, e);exceptions.add(e);}if (result != null) {break;}}// hit nothingif (result == null) {throw new GlideException(failureMessage, new ArrayList<>(exceptions));}return result;}
}
Glide日志分析

以下报错日志可以看出来,Glide逐个尝试了每个Decoder

以及每个Decoder的解码过程,如果成功,最终都将解出Drawable

Cause (1 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{FileInputStream->GifDrawable->Drawable}
Cause (2 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{FileInputStream->Bitmap->Drawable}
Cause (3 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{FileInputStream->BitmapDrawable->Drawable}
Cause (4 of 4): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{FileInputStream->SVG->Drawable}

http://www.mrgr.cn/news/7540.html

相关文章:

  • 笔试算法-编程练习-01-J-24
  • 洛谷p1168中位数题解
  • npm打包报错解决办法--因网络问题,node-gyp依赖的node-headers无法下载
  • EmguCV学习笔记 VB.Net 5.2 仿射变换
  • GATK SampleList接口介绍
  • 【C++】vector的模拟实现
  • thrift:拦截器ThriftEventHandler获取调用参数
  • 猫头虎分享:Python库 Pip 的简介、安装、用法详解入门教程
  • 尚品汇静态网页设计
  • OpenAI 将向企业开放 GPT-4o 模型定制版
  • [AWS云]Xshell连接EC2报错:所选用户的用户密钥未在远程主机上注册(2)重置环境
  • 多个fork线程与主线程或其他的pthread线程通信的例子
  • 企业财务自动化:RPA机器人的优势与挑战
  • 【数据结构】堆主要的应用场景
  • ubuntu安装minio
  • $(SolutionDir) 是一个常用的 MSBuild 变量,用于指向 Visual Studio 解决方案文件 (.sln) 所在的目录
  • unity程序简易框架
  • C# ArrayList
  • SpringBoot 3.x+Mybatis Plus多数据源极简配置
  • java整合DL645-2007与Dl645-1997