本文章整理:Android源码分析:手把手带你分析 Glide的缓存功能
1. Glide缓存机制简介
1.1 缓存的图片资源
Glide 需要缓存的 图片资源 分为两类:
- 原始图片(Source) :即图片源的图片初始大小 & 分辨率
- 转换后的图片(Result) :经过 尺寸缩放 和 大小压缩等处理后的图片
当使用 Glide加载图片时,Glide默认 根据 View视图对图片进行压缩 & 转换,而不显示原始图(这也是Glide加载速度高于Picasso的原因)
1.2 缓存机制设计
- Glide的缓存功能设计成 二级缓存:内存缓存 & 硬盘缓存
并不是三级缓存,因为 从网络加载 不属于缓存
- 缓存读取顺序:内存缓存 –> 磁盘缓存 –> 网络
- 内存缓存 默认开启
- Glide中,内存缓存 & 磁盘缓存相互不影响,独立配置
- 二级缓存的作用不同:
- 内存缓存:防止应用 重复将图片数据 读取到内存当中
只 缓存转换过后的图片
- 硬盘缓存:防止应用 重复从网络或其他地方重复下载和读取数据
可缓存原始图片 & 缓存转换过后的图片,用户自行设置
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) & 弱引用机制
- LruCache算法原理:将 最近使用的对象 用强引用的方式 存储在LinkedHashMap中 ;当缓存满时 ,将最近最少使用的对象从内存中移除
- 弱引用:弱引用的对象具备更短生命周期,因为 当JVM进行垃圾回收时,一旦发现弱引用对象,都会进行回收(无论内存充足否)
2.2 磁盘缓存
- 具体使用
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
// 缓存参数说明
// DiskCacheStrategy.NONE:不缓存任何图片,即禁用磁盘缓存
// DiskCacheStrategy.ALL :缓存原始图片 & 转换后的图片
// DiskCacheStrategy.SOURCE:只缓存原始图片(原来的全分辨率的图像,即不缓存转换后的图片)
// DiskCacheStrategy.RESULT:(默认)只缓存转换后的图片(即最终的图像:降低分辨率后 / 或者转换后 ,不缓存原始图片
- 实现原理
使用Glide 自定义的DiskLruCache算法
- 该算法基于 Lru 算法中的DiskLruCache算法,具体应用在磁盘缓存的需求场景中
- 该算法被封装到Glide自定义的工具类中(该工具类基于Android 提供的DiskLruCache工具类
网友评论