以下是通过实例讲解 Glide 缓存策略控制的常见应用场景,涵盖基础配置到高级优化,帮助开发者合理利用缓存提升性能和用户体验。
Glide 缓存机制回顾
Glide 默认采用三级缓存策略:
1. 活动缓存 (Active Resources):弱引用缓存正在使用的资源。
2. 内存缓存 (Memory Cache):LRU 算法缓存最近使用的资源。
3. 磁盘缓存 (Disk Cache):分为 DATA(原始数据)和 RESOURCE(转换后的资源)。
场景 1:优先使用缓存,减少网络请求
需求:加载频繁访问的静态图片(如用户头像),避免重复下载。
实现:通过 diskCacheStrategy() 配置缓存策略,优先读取磁盘缓存。
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始数据 + 转换后的资源
.into(imageView)
原理:首次加载后,后续请求直接命中磁盘缓存,无需网络请求。
场景 2:实时更新图片,强制跳过缓存
需求:服务器图片更新频繁(如实时监控画面),需绕过缓存获取最新数据。
实现:跳过内存和磁盘缓存,直接请求网络。
Glide.with(context)
.load(url)
.skipMemoryCache(true) // 跳过内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE) // 跳过磁盘缓存
.into(imageView)
注意:若仍需缓存新数据,可仅跳过内存缓存,保留磁盘缓存:
.diskCacheStrategy(DiskCacheStrategy.DATA) // 仅缓存原始数据
场景 3:节省流量,仅加载缓存
需求:弱网环境下,仅显示已缓存的图片(无缓存时显示占位符)。
实现:使用 onlyRetrieveFromCache(true) 限制仅从缓存加载。
Glide.with(context)
.load(url)
.onlyRetrieveFromCache(true)
.placeholder(R.drawable.placeholder)
.into(imageView)
效果:若缓存不存在,触发 onLoadFailed 回调并显示占位符。
场景 4:大图或 GIF 缓存优化
需求:大图或 GIF 占用内存较高,需避免内存缓存溢出。
实现:禁用内存缓存,仅保留磁盘缓存。
Glide.with(context)
.load(gifUrl)
.asGif()
.skipMemoryCache(true) // 跳过内存缓存
.diskCacheStrategy(DiskCacheStrategy.DATA) // 缓存原始 GIF 数据
.into(imageView)
优化点:通过 override() 限制加载尺寸,减少内存占用:
.override(500, 500) // 限制解码后的图片尺寸
场景 5:动态 URL 图片缓存控制
需求:URL 不变但图片内容变化(如验证码),需强制更新缓存。
实现:通过 signature() 添加唯一标识(如时间戳),使缓存失效。
val currentTime = System.currentTimeMillis().toString()
Glide.with(context)
.load(url)
.signature(StringSignature(currentTime)) // 动态签名
.into(imageView)
原理:签名变化时,Glide 会重新加载并更新缓存。
场景 6:敏感数据禁用磁盘缓存
需求:加载隐私图片(如用户证件照),避免本地留存。
实现:完全禁用磁盘缓存。
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
场景 7:自定义缓存键(Key)
需求:根据业务逻辑区分缓存(如不同用户加载同一 URL 的不同资源)。
实现:自定义 Key 生成逻辑。
// 自定义 Key 生成器(例如加入用户 ID)
class UserAwareKey(val userId: String, val url: String) : Key {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("$userId-$url".toByteArray())
}
// 需重写 equals 和 hashCode
}
// 使用
Glide.with(context)
.load(url)
.signature(UserAwareKey("user123", url))
.into(imageView)
最佳实践与调试技巧
-
缓存策略选择:
DiskCacheStrategy.AUTOMATIC(默认):智能选择缓存类型。DiskCacheStrategy.DATA:缓存原始数据(如网络请求结果)。DiskCacheStrategy.RESOURCE:缓存转换后的资源(如缩放后的 Bitmap)。
-
调试缓存命中:
adb shell setprop log.tag.Glide VERBOSE- 日志关键词:
Loaded resource from cache(内存缓存)、Decoded from cache(磁盘缓存)。
- 日志关键词:
-
手动清理缓存:
// 清理内存缓存 Glide.get(context).clearMemory() // 异步清理磁盘缓存(需在子线程执行) Thread { Glide.get(context).clearDiskCache() }.start()
总结:场景与策略对照表
| 场景 | 推荐配置 |
|---|---|
| 频繁加载静态图片 | diskCacheStrategy(DiskCacheStrategy.ALL) |
| 实时更新图片 | skipMemoryCache(true) + diskCacheStrategy(NONE) |
| 弱网环境省流量模式 | onlyRetrieveFromCache(true) |
| 大图/GIF 内存优化 | skipMemoryCache(true) + override() |
| 动态 URL 内容更新 | signature(动态值) |
| 敏感数据保护 | diskCacheStrategy(NONE) |
通过合理配置缓存策略,可以在性能、流量消耗和用户体验之间取得平衡。建议结合 RequestListener 监控加载过程,并根据业务需求动态调整策略。
当前文章价值0.8元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

评论已关闭!