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加载网络图片

(图片尺寸有点大,若看不清,可下载后查看。)

  • 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 文件。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值