glide4.7.1解析

本文章整理:Android源码分析:手把手带你分析 Glide的缓存功能

1. Glide缓存机制简介

1.1 缓存的图片资源

Glide 需要缓存的 图片资源 分为两类:

  • 原始图片(Source) :即图片源的图片初始大小 & 分辨率
  • 转换后的图片(Result) :经过 尺寸缩放 和 大小压缩等处理后的图片

当使用 Glide加载图片时,Glide默认 根据 View视图对图片进行压缩 & 转换,而不显示原始图(这也是Glide加载速度高于Picasso的原因)

1.2 缓存机制设计

  • Glide的缓存功能设计成 二级缓存:内存缓存 & 硬盘缓存

并不是三级缓存,因为 从网络加载 不属于缓存

  • 缓存读取顺序:内存缓存 –> 磁盘缓存 –> 网络
  1. 内存缓存 默认开启
  2. Glide中,内存缓存 & 磁盘缓存相互不影响,独立配置
  • 二级缓存的作用不同:
  1. 内存缓存:防止应用 重复将图片数据 读取到内存当中

只 缓存转换过后的图片

  1. 硬盘缓存:防止应用 重复从网络或其他地方重复下载和读取数据

可缓存原始图片 & 缓存转换过后的图片,用户自行设置

2. Glide 缓存功能实现流程

  • Glide 的缓存功能分为:内存缓存 & 磁盘缓存

2.1 内存缓存

  • 具体使用
// 默认开启内存缓存,用户不需要作任何设置
Glide.with(this)
     .load(url)
     .into(imageView);

// 可通过 API 禁用 内存缓存功能
Glide.with(this)
     .load(url)
     .skipMemoryCache(true) // 禁用 内存缓存
     .into(imageView);
  • 实现原理

Glide的内存缓存实现是基于:LruCache 算法(Least Recently Used) & 弱引用机制

  1. LruCache算法原理:将 最近使用的对象 用强引用的方式 存储在LinkedHashMap中 ;当缓存满时 ,将最近最少使用的对象从内存中移除
  2. 弱引用:弱引用的对象具备更短生命周期,因为 当JVM进行垃圾回收时,一旦发现弱引用对象,都会进行回收(无论内存充足否)

2.2 磁盘缓存

  • 具体使用
Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

// 缓存参数说明
// DiskCacheStrategy.NONE:不缓存任何图片,即禁用磁盘缓存
// DiskCacheStrategy.ALL :缓存原始图片 & 转换后的图片
// DiskCacheStrategy.SOURCE:只缓存原始图片(原来的全分辨率的图像,即不缓存转换后的图片)
// DiskCacheStrategy.RESULT:(默认)只缓存转换后的图片(即最终的图像:降低分辨率后 / 或者转换后 ,不缓存原始图片
  • 实现原理

使用Glide 自定义的DiskLruCache算法

  1. 该算法基于 Lru 算法中的DiskLruCache算法,具体应用在磁盘缓存的需求场景中
  2. 该算法被封装到Glide自定义的工具类中(该工具类基于Android 提供的DiskLruCache工具类

3. 缓存机制代码实现

glide4.7.1解析_第1张图片
image.png

你可能感兴趣的:(glide4.7.1解析)