Glide系列(一) — Glide 框架结构浅析

一、概述

1.1 背景

Glide 是一个图片加载库,跟它同类型的库还有 Picasso、Fresco、Universal-Image-Loader 等。基于 Glide 优秀的缓存管理策略和生命周期关联的特点,目前市面上对 Glide 的使用非常广,因此我们有必要深入研究下 Glide 相关的实现原理,便于更好的使用它。

目前 Glide 版本已经更新到 4.11.0,但本系列我们仍采用 Glide3.7.0 版本进行分析,原因有两个:

  • 3.7.0 版本代码相对比较简单。
  • 与 3.7.0 版本相比,4.0+ 版本之后代码改动较大。

所以本着先易后难的原则,我们使用 Glide 3.7.0 来进行分析,对 Glide 整体有一个全面了解之后,再去分析 4.0+ 版本。


Glide 版本: Glide 3.7.0
Github 地址: https://github.com/bumptech/glide/tree/v3.7.0
Gradle 依赖: implementation 'com.github.bumptech.glide:glide:3.7.0'

1.2 Glide 框架的优点

  1. 加载类型多样化:Glide 支持 Gif、WebP、Jpeg、Png 等格式的图片。
  2. 生命周期的绑定:图片请求与页面生命周期绑定,避免内存泄漏。
  3. 使用简单(链式调用),且提供丰富的 Api 功能 (如: 图片裁剪等功能)。
  4. 高效的缓存策略:
    1. 支持多种缓存策略 (Memory 和 Disk 图片缓存)。
    2. 根据 ImageView 的大小来加载相应大小的图片尺寸。
    3. 内存开销小,默认使用 RGB_565 格式 (3.x 版本)。
    4. 复用对象 (享元模式),降低内存的抖动。
    5. 通过 Lru 算法来管理内存缓存和磁盘缓存,保证资源使用的可控性。

1.3 系列文章

  1. Glide系列(一) — Glide 框架结构浅析
  2. Glide系列(二) — DataLoadProvider 及与 Encoder&Decoder 的关系
  3. Glide系列(三) — LoadProvider、ModelLoader、DataFetcher 和 ResourceTranscoder 关系
  4. Glide系列(四) — Glide 缓存流程分析
  5. Glide系列(五) — Request 构建流程分析
  6. DiskLruCache 源码分析

二、Glide 框架整体结构设计

Glide 框架整体结构如下图所示。
在这里插入图片描述

Glide 框架结构如上图所示:

  1. Glide 框架主要分为两大流程:
    1.1 图片请求的构建流程
    1.2 图片缓存的获取流程
  2. 图片请求构建流程内又分为四个模块:
    2.1 用户态的请求模块: 用户使用 Glide 进行链式调用的时候会生成一个用户态的 Request。
    2.2 真实的请求模块: 由于步骤2.1中会根据场景构建多种Request,因此在发起图片请求时需要进行收口,因此会使用用户态的 Request 构建一个真正的 GenericRequest 请求。
    2.3 Request 生命周期管理模块: Glide 的一大特点是会将图片的请求和页面生命周期进行绑定,避免出现内存泄漏的风险,因此会有一个 Request 生命周期管理模块。
    2.4 Registry中心模块: 由于 Glide 支持加载多种类型的数据,因此在注册中心会预先注册所支持类型处理类的信息。
  3. 图片缓存一共分为3大层,5小层:
    3.1 内存缓存(2小层): 弱引用缓存、LruCache。
    3.2 本地缓存(2小层): 本地 ResultCache 缓存、本地 SourceCache 缓存。
    3.3 Source 数据源(1小层): 网络获取、本地 AssetPath 获取、其它本地图片。

小结:

看到这里,只要知道以下三点就可以了。

  1. 知道 Glide 分为两大流程 (请求创建流程、缓存获取流程) 就可以了。
  2. 知道 Glide 缓存部分分为3大层,5小层就可以了。
  3. 可以将 Glide 的两大流程与网络请求进行类比。网络请求也分为两个流程:网络请求的构建流程、数据的接收和响应流程 (Glide的缓存获取流程)。
  4. 这里我们对五层缓存进行定义,方便后面引用说明:
    1. 第一层:内存缓存 -> 弱应用缓存(ActiveResource)。
    2. 第二层:内存缓存 -> LruCache
    3. 第三层:磁盘缓存 -> ResultCache (经过transform的图)
    4. 第四层:磁盘缓存 -> SourceCache (从DataFetcher 直接拉取到的数据)
    5. 第五层:数据源 -> Source

三、Glide中涉及的几个基本概念

在研究 Glide 之前,需要对下面几个类有一个基本概念。

Glide中涉及的几个基本概念:

  • Target、ViewTarget 是什么?
  • Resource 是什么?
  • Encoder、ResourceEncoder 是什么?
  • ResourceDecoder 是什么?
  • Transformation 是什么?
  • ResourceTranscoder 是什么?
  • DataFetcher、ModelLoader 是什么?
  • DataLoadProvider、LoadProvider 是什么?
  • DataLoadProvider、ModelLoader、DataFetcher 之间的关系?

3.1 Target、ViewTarget 是什么?

  • Target、ViewTarget 的作用类似于网络请求中的 Callback,主要是用于处理图片已经返回后的逻辑。主要的回调方法如下图所示。
  • Target 与 ViewTarget 的主要区别在于 ViewTarget 中包含有一个设置图片的 View。
  • Target 实现了 LifecycleListener,方便在处理生命周期时调用对应的方法。
public interface Target<R> extends LifecycleListener {
   
   
	// 开始请求
    void onLoadStarted(Drawable placeholder);
	// 请求失败
    void onLoadFailed(Exception e, Drawable errorDrawable);
	// 请求成功
    void onResourceReady(R resource, GlideAnimation<? super R> glideAnimation);
}

3.2 Resource 是什么?

  • Resource 的作用类似于网络请求返回时统一的数据封装 Result,目的是便于数据的传输。
  • 同时针对 Resource 包含的不同数据类型,获取相应的编解码器等。
// 网络接口数据封装
class Result<T> {
   
   
	T data;
}

// 用于包装从缓存中获取的数据(图片)
public interface Resource<Z> {
   
   
    Z get();
}
// 具体的使用场景
public class BitmapResource implements Resource<Bitmap> {
   
   
    private final Bitmap bitmap;
    @Override
    
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值