Glide 框架解析

Posted 唯夜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Glide 框架解析相关的知识,希望对你有一定的参考价值。

Glide 框架解析

Glide 是我们常用的图片加载库,使用了很多图片管理的技术,以及常用的两级缓存,这篇文章重点是给他家解析一下Glide的框架设计,重点不在各种技术的詳細要点。学习优秀开源项目的框架有助于我们优化自己的代码结构,写出更加优美的代码,同时开拓自己的眼界,在技术的路上越走越远。

概览

首先看一张 Glide 类的概览图,只写了重点结构的关键类,为了让大家对Glide有个感性的认识。

1. 当我们使用Glide发起请求的时候就创建了一个 Request

来看一段熟悉的代码:

Glide.with(this).load("url").into(imageView);

这段代码的实质就是 Glide 通过 Request 子系统创建了一个 Request 并使用 ViewTargetView#setTagImageView 绑定到一起,当 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 有个注册系统 RegisterGlide 初始化的时候会将所有支持的 ModelLoader Encoder Decoder 注册到 Glide 中去,当需要使用的时候通过 GlideContext 获取已经注册的工具。

  • 上面的流程中已经说清楚了 ReqestViewTarget 的关系

  • Glide.with(this).load("url").into(imageView); 这里调用 into 方法的时候就启动了 SingleRequest ,调用了 SingleRequest#begin 方法,启动了加载资源的请求。 SingleRequest#begin 启动请求后,会检查尺寸是否正常,怎会进入 SingleRequest#onSizeReady 。最后启动 Engine#load 启动加载任务。

  • Engine 通过 DecodeJobFactoryEnginJobFactory 创建 DecodeJobEnginJob ,最后将 DecodeJob 加如 EngineJob 中,启动 DecodeJob

  • DecodeJob 实现了 RunnableEngineJob 内部有不同类型的 ThreadPoolExecutor 来执行不同类型的 DecodeJob

  • DecodeJob 通过 DataFetcherGenerator 获取不同类型的 DataFetcher,这里为 HttpUrlFetcher 为例。 DataFetcherGenerator 是一个接口,有三种类型的实现,一种是 SourceGenerator 加载网络源文件用, 第二种是 DataCacheGenerator 用来加载本地缓存文件, 还有一种是 ResourceCacheGenerator 加载 resource 类型资源。

  • DataFetcherGenerator 内部又是通过 DecodeHelper 获取不同类型的 ModelLoaderModelLoader 就是 Glide#load 时候传入的加载资源类型,可以是 url,file,res类型。 SourceGenerator 使用的是 HttpUrlLoad 来加载网络图片,然后 HttpUrlLoad 内部有一个 DataFetcher,最终获得了 HttpUrlFetcher ,最终使用了 UrlConnection 加载 Source 文件。

以上是关于Glide 框架解析的主要内容,如果未能解决你的问题,请参考以下文章

Android图片加载框架最全解析,Glide的基本用法

Android图片加载框架最全解析,从源码的角度理解Glide的执行流程

安卓 Glide图形加载框架

使用第三方框架Glide显示网络图片

Android 常用开源框架源码解析 系列 picasso 图片框架

开源软件分析