当前位置: 首页 > news >正文

glide缓存策略和缓存命中

一 缓存策略

1 Glide 的 diskCacheStrategy() 一共有 5 种枚举值(DiskCacheStrategy),每种的作用和区别如下:


1. DiskCacheStrategy.ALL

  • 作用:同时缓存原始图片(原图数据)和经过变换(比如裁剪、缩放)后的图片。
  • 特点:
    • 加载相同 URL 但不同尺寸的图片时会用到原图缓存重新生成,节省网络请求。
    • 占用磁盘空间较大。
  • 使用场景:同一图片需要加载多种尺寸版本时(比如列表缩略图 + 详情页原图)。
  • 示例:
Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView)

2. DiskCacheStrategy.DATA

  • 作用:只缓存原始数据(网络下载的原图文件),不缓存经过变换后的版本。
  • 特点:
    • 如果相同 URL 但不同尺寸的图片会再次加载,需要重新执行变换(裁剪、缩放)。
    • 节省磁盘,但 CPU 会多次参与图片处理。
  • 使用场景:图片需要多次处理或每次显示尺寸不固定,且不介意重新计算。
  • 示例:
Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.DATA).into(imageView)

3. DiskCacheStrategy.RESOURCE

  • 作用:只缓存经过变换处理后的图片,不缓存原始数据。
  • 特点:
    • 每次加载相同尺寸的图片时速度很快。
    • 如果需要加载不同尺寸的图片,就得重新从网络获取。
  • 使用场景:固定尺寸、固定变换的图片(比如头像 100×100)。
  • 示例:
Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(imageView)

4. DiskCacheStrategy.NONE

  • 作用:不缓存任何内容(既不缓存原图,也不缓存变换结果)。
  • 特点:
    • 每次都从源头重新加载(网络、本地、ContentProvider 等)。
    • 网络耗时高,但适合加载经常变化的图片(例如验证码、实时数据图)。
  • 使用场景:动态变化的图片。
  • 示例:
Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView)

5. DiskCacheStrategy.AUTOMATIC(默认值)

  • 作用:根据图片来源和变换自动选择最佳策略。
  • 特点:
    • 网络图片:一般缓存变换后的结果(类似 RESOURCE)。
    • 本地图片(assets、file):可能不缓存(因为本地读速度快)。
    • 大部分情况性能和空间占用平衡。
  • 使用场景:不想自己纠结用哪种策略时,直接用默认。
  • 示例:
Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) // 可省略.into(imageView)

常用选择建议

  • 列表/固定尺寸头像等 → RESOURCE(加载快,占空间少)。
  • 同一图片多种尺寸 → ALL(减少网络请求)。
  • 动态图片(验证码/频繁变化) → NONE。
  • 懒得选 → 用默认 AUTOMATIC(Glide 4.x 优化得不错)。

如果在做车机空调App那种大图(2500px 宽背景),
会建议用 DiskCacheStrategy.RESOURCE 来直接缓存裁剪/缩放后的版本,
这样 Fragment 切换时就能秒加载,不会卡顿或闪烁。


2 Glide 缓存策略对比表


Glide diskCacheStrategy() 对比表

策略是否缓存原图(DATA)是否缓存变换后(RESOURCE)优点缺点适用场景
ALL原图 & 各种尺寸都可复用,减少网络请求占磁盘最多同一 URL 需要多种尺寸或变换
DATA原图可复用,多尺寸可重新生成每次都要重新变换,CPU 占用高多尺寸、多变换,但磁盘紧张
RESOURCE固定尺寸加载快,占磁盘少换尺寸需要重新下载固定尺寸图片(头像、列表)
NONE每次都拉取最新网络 & CPU 占用高验证码、实时图片
AUTOMATIC(默认)自动决定自动决定性能和空间平衡不可控(依赖 Glide 判断)大部分情况直接用它


车机空调大图场景建议

  • 如果背景图尺寸固定 → RESOURCE

    • 直接缓存最终展示尺寸,Fragment 切换秒加载。
  • 如果一个图多种尺寸(比如背景 + 缩略图) → ALL

    • 原图 + 各种变换都能直接复用,避免重复请求和变换。

记忆口诀

  • ALL:全缓存(原图 + 变换)
  • DATA:只原图(省空间但要重算)
  • RESOURCE:只结果(快但不通用)
  • NONE:啥都不留(实时变化)
  • AUTO:交给 Glide(偷懒模式)


二 检查缓存是否命中

Glide 缓存命中检查方案:

  • 日志配置
  • 不同缓存命中标识
  • 手动检查缓存 API(日志不够用时)

1. 开启 Glide 全量调试日志

class MyApp : Application() {override fun onCreate() {super.onCreate()Glide.init(this,GlideBuilder().setLogLevel(Log.DEBUG) // 输出 DEBUG 级别日志)}
}

这样 Glide 会在 Logcat 中输出类似:

  • 内存缓存命中
Loaded resource from MEMORY_CACHE
  • 磁盘缓存命中
Loaded resource from DISK_CACHE
  • 网络/本地原始加载(没命中任何缓存)
Loaded resource from DATA

说明:

  • MEMORY_CACHE → 命中内存缓存(速度最快,不走磁盘 IO)
  • DISK_CACHE → 命中磁盘缓存(会解码成 Bitmap)
  • DATA → 没有缓存,直接从网络、本地文件或 ContentProvider 读取

2. 通过 RequestListener 精准判断

有时不想看 Logcat,而是想在代码里记录命中情况,这可以用 RequestListener 判断 DataSource:

Glide.with(context).load(url).listener(object : RequestListener<Drawable> {override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {Log.e("GlideCheck", "加载失败: ${e?.message}")return false}override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?,dataSource: DataSource?, isFirstResource: Boolean): Boolean {when (dataSource) {DataSource.MEMORY_CACHE -> Log.d("GlideCheck", "内存缓存命中")DataSource.DISK_CACHE -> Log.d("GlideCheck", "磁盘缓存命中")DataSource.DATA -> Log.d("GlideCheck", "缓存未命中(原始数据加载)")DataSource.REMOTE -> Log.d("GlideCheck", "网络加载")DataSource.LOCAL -> Log.d("GlideCheck", "本地文件加载")else -> Log.d("GlideCheck", "未知数据源")}return false}}).into(imageView)

这样不看日志也能准确知道缓存命中情况,并且可以在 UI 或调试工具里显示。


3. 手动检查缓存是否存在(不触发加载)

有时想提前判断某个 URL 是否已经在磁盘缓存里,可以用:

fun isImageInCache(context: Context, url: String): Boolean {val future = Glide.with(context).downloadOnly().load(url).onlyRetrieveFromCache(true) // 只从缓存取,不走网络.submit()return try {future.get() // 如果能拿到文件,说明有缓存true} catch (e: Exception) {false}
}

4. 实战判断逻辑

综合起来,可以这样判断:

  1. 先用 onlyRetrieveFromCache(true) 提前检测是否有磁盘缓存(可做预加载优化判断)。
  2. 加载时用 RequestListener 获取真实加载来源(内存/磁盘/网络)。
  3. 配合 Glide 日志 双重验证。

三 Glide缓存流程图

请添加图片描述

四 总结

  1. 缓存策略有五种:ALL,DATA,RESOURCE,NONE,AUTOMATIC(默认),即原图缓存、转换后缓存,原图缓存,转换后缓存,不缓存,由glide处理缓存策略。
  2. 缓存命中,可以通过日志查看,RequestListener 和onlyRetrieveFromCache(true) 来查看是否命中了缓存
http://www.lryc.cn/news/617132.html

相关文章:

  • 探秘华为:松山湖的科技与浪漫之旅
  • 打烊:餐厅开业前的“压力测试”
  • 《汇编语言:基于X86处理器》第13章 高级语言接口(1)
  • 前端实现 MD5 + AES 加密的安全登录请求
  • JVM基础【Java】
  • leetcode-hot-100 (图论)
  • 心理咨询|学生心理咨询评估系统|基于Springboot的学生心理咨询评估系统设计与实现(源码+数据库+文档)
  • python面向对象设计模式
  • 电子电气架构 --- 软件定义汽车的驱动和挑战
  • 飞算JavaAI vs 传统开发:效率与质量的双重突破
  • 【MySQL✨】服务器安装 MySQL 及配置相关操作
  • Orange的运维学习日记--38.MariaDB详解与服务部署
  • B站直播, 拼接4个窗口,能否实现
  • Deepoc如何让传统码垛机器人获得“类人决策力“​
  • 服务器配置实战:从 “密码锁” 到 “分工协作” 的知识点详解
  • docter的使用、vscode(cursor)和docker的连接,详细分析说明
  • Django Request 与 DRF Request 的区别
  • 低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?
  • 智能双行框!百度全量上线AI搜索,是革新浪潮还是昙花一现?
  • ECCV 2024 论文解读丨具身智能、机器人研究最新突破创先点分享合集
  • SQL刷题
  • 使用行为树控制机器人(三) ——通用端口
  • 想冲华为AI认证,怎么选方向?
  • 疯狂星期四文案网第36天运营日记
  • 【Docker-Day 13】超越默认Bridge:精通Docker Host、None与自定义网络模式
  • IDE认知革命:JetBrains AI Assistant插件深度调教手册(终极实战指南)
  • 随身WiFi技术军备赛白热化:WiFi6架构下放中端市场,格行中兴华为三足鼎立;从芯片到场景的 10 款标杆产品深度解析
  • 标准IO详解(fgets、gets、fread、fwrite、fseek 等应用)
  • 面试题-----微服务业务
  • 【PRML】分类