Glide 框架解析
Posted 唯夜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Glide 框架解析相关的知识,希望对你有一定的参考价值。
Glide 框架解析
Glide 是我们常用的图片加载库,使用了很多图片管理的技术,以及常用的两级缓存,这篇文章重点是给他家解析一下Glide的框架设计,重点不在各种技术的詳細要点。学习优秀开源项目的框架有助于我们优化自己的代码结构,写出更加优美的代码,同时开拓自己的眼界,在技术的路上越走越远。
概览
首先看一张 Glide 类的概览图,只写了重点结构的关键类,为了让大家对Glide有个感性的认识。
1. 当我们使用Glide发起请求的时候就创建了一个 Request
来看一段熟悉的代码:
Glide.with(this).load("url").into(imageView);
这段代码的实质就是 Glide
通过 Request
子系统创建了一个 Request
并使用 ViewTarget
和 View#setTag
将 ImageView
绑定到一起,当 Request
完成后通过绑定关系将最终加载的图片资源设置到 ImageView
上。
2. SingleRequest
通过调用核心 Engine
核心类完成图片加载
3. Engine
创建 EngineJob
启动核心线程池
4. EngineJob
调用核心的图片编码类 DecodeJob
创建编码任务
5. DecodeJob
最终使用 DataFetcher
最终去加载图片资源
6. DataFetcher
是一个数据查询器的接口,有多种实现,url,file,cache,resource各种类型的数据加载器
以上说明了核心的加载过程,中间使用了很多工厂设计模式,通过工厂的方式创建类,这里没有做詳細的描述,下面会以加载url的流程重点讲解 Glide
的核心工作流程。
通过加载 URL
来詳細了解 Glide
的核心框架
(图片尺寸有点大,若看不清,可下载后查看。)
Glide 有个注册系统
Register
当Glide
初始化的时候会将所有支持的ModelLoader
Encoder
Decoder
注册到Glide
中去,当需要使用的时候通过GlideContext
获取已经注册的工具。上面的流程中已经说清楚了
Reqest
和ViewTarget
的关系Glide.with(this).load("url").into(imageView);
这里调用into
方法的时候就启动了SingleRequest
,调用了SingleRequest#begin
方法,启动了加载资源的请求。SingleRequest#begin
启动请求后,会检查尺寸是否正常,怎会进入SingleRequest#onSizeReady
。最后启动Engine#load
启动加载任务。Engine
通过DecodeJobFactory
和EnginJobFactory
创建DecodeJob
和EnginJob
,最后将DecodeJob
加如EngineJob
中,启动DecodeJob
。DecodeJob
实现了Runnable
,EngineJob
内部有不同类型的ThreadPoolExecutor
来执行不同类型的DecodeJob
。DecodeJob
通过DataFetcherGenerator
获取不同类型的DataFetcher
,这里为HttpUrlFetcher
为例。DataFetcherGenerator
是一个接口,有三种类型的实现,一种是SourceGenerator
加载网络源文件用, 第二种是DataCacheGenerator
用来加载本地缓存文件, 还有一种是ResourceCacheGenerator
加载 resource 类型资源。DataFetcherGenerator
内部又是通过DecodeHelper
获取不同类型的ModelLoader
,ModelLoader
就是Glide#load
时候传入的加载资源类型,可以是 url,file,res类型。SourceGenerator
使用的是HttpUrlLoad
来加载网络图片,然后HttpUrlLoad
内部有一个DataFetcher
,最终获得了HttpUrlFetcher
,最终使用了UrlConnection
加载 Source 文件。
以上是关于Glide 框架解析的主要内容,如果未能解决你的问题,请参考以下文章
Android图片加载框架最全解析,从源码的角度理解Glide的执行流程