一 缓存策略

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.pswp.cn/diannao/95200.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95200.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95200.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将PDF文档进行高效编辑处理!

PDF文件可以在任何设备上以相同的格式查看&#xff0c;无论操作系统或软件环境如何&#xff0c;可以确保修改后的文档仍然保持原有的布局和格式。它完全免费&#xff0c;下载后双击即可运行&#xff0c;无需安装&#xff0c;使用非常方便。它具备出色的文本编辑功能&#xff0c…

应用层模拟面试题

模拟面试-C第一题(开发音视频处理模块)在开发音视频处理模块时&#xff0c;FFmpeg资源&#xff08;AVFrame*&#xff09;需要自动释放。如何用unique_ptr定制删除器替代手动av_frame_free()&#xff1f;写出代码并解释RAII优势。参考答案&#xff1a;auto frame_deleter[](AVFr…

分享一款基于STC8H8K32U-45I-LQFP48单片机的4路数字量输入输出模块

4路数字量输入输出模块产品说明产品特性输入部分&#xff1a; 4路光耦隔离数字量输入通道支持NPN和PNP两种输入方式&#xff0c;可通过拨码开关切换输入电压范围&#xff1a;10-30VDC典型应用&#xff1a;可连接按钮开关、接近开关、光电传感器等数字信号设备输出部分&#xff…

redis常见的性能问题

Redis 的性能问题通常源于配置不当、数据结构误用、资源瓶颈或架构缺陷。以下是 Redis 常见的性能问题及优化方案&#xff0c;结合线上经验整理&#xff1a;&#x1f9e0; ​一、内存相关问题​​1. 内存不足&#xff08;OOM&#xff09;​​​现象​&#xff1a;OOM errors、响…

Blender 基础操作

基础操作 一、视角控制 ①旋转视角 &#xff1a; 拖动鼠标中键 ②平移视角 &#xff1a; shift 鼠标中键 ③放大\缩小 &#xff1a;鼠标滚轮 二、物体控制 1、重要 ① 移动物体 : G ② 旋转物体 : R ③ 缩放物体 : S 2、不重要 ④ 新建物体 : shift A ⑤ 复制物体 : shift D…

Go 语言三大核心数据结构深度解析:数组、切片(Slice)与映射(Map)

&#x1f680;Go 语言三大核心数据结构深度解析&#xff1a;数组、切片&#xff08;Slice&#xff09;与映射&#xff08;Map&#xff09; 在 Go 语言的开发领域&#xff0c;数组、切片与映射 这三大核心数据结构犹如构建程序的基石&#xff0c;支撑着各类数据的存储与处理。它…

《Webpack与Vite热模块替换机制深度剖析与策略抉择》

从早期简单的文件合并工具,到如今功能强大、高度自动化的Webpack和Vite,它们重塑了前端开发的流程与效率。而热模块替换(HMR, Hot Module Replacement)机制,作为其中关键的一环,更是成为开发者提升开发体验、加速项目迭代的秘密武器。Webpack,作为前端构建领域的先驱者,…

虚拟乐队“天鹅绒落日”:AI生成音乐引发的行业风暴

引言近日&#xff0c;音乐行业掀起了一阵关于一支名为“The Velvet Sundown”&#xff08;天鹅绒落日&#xff09;乐队的新闻热潮。原因何在&#xff1f;这支乐队很可能并非真正的乐队&#xff0c;其音乐也或许是由人工智能生成的。事实上&#xff0c;越来越多的共识认为&#…

c++ final override 关键字

1.finalfinal 防止子类继承&#xff0c;用于类或虚函数&#xff0c;限制继承或重写class Base final {}; // Base类不能被继承class Base { public:virtual void foo() final; // 禁止子类重写foo() };2.overrideoverride 子类中重写父类中函数&#xff0c;&#xff0c;仅用于…

剑桥大学最新研究:基于大语言模型(LLM)的分子动力学模拟框架,是MD的GPT时刻还是概念包装?

近期&#xff0c;剑桥大学 Michele Vendruscolo 团队在预印本平台上发布了一项最新研究&#xff0c;提出了一个名为 MD-LLM 的框架&#xff0c;旨在为高效研究蛋白质动态提供一种全新的思路。简单来说&#xff0c;他们希望借助大语言模型&#xff08;LLM&#xff09;&#xff0…

MySQL梳理:其他

MySQL数据库技术知识合集&#xff0c;涵盖InnoDB存储引擎的区管理机制、缓冲池机制等核心技术要点。本文档将持续补充MySQL相关的重要技术知识点。 &#x1f4cb; 目录 模块一&#xff1a;InnoDB区状态管理机制 1.1 核心设计思想1.2 四种区状态详解1.3 渐进式空间分配策略1.4…

影刀 —— 飞书电子表格

以获取列上第一个可用行为例我们需要获取的分别是 凭证 和 表格唯一标识首先来看如何获取凭证在飞书开发者后台创建应用然后添加权限发版拿App ID 和 App Secret下面来创建电子表格&#xff01;&#xff01;&#xff01;注意这个表格一定不要创建到知识库里面如果创建到知识库里…

1.二维图像处理(完整版)

目录 1.变换矩阵 2.在矩阵的基础上添加各种变换形式 3.开始变换 4.计算变换矩阵参数 新算子 二、阈值分割 新算子 三、blob分析案例 1.焊点 2.石头 3.木材 4.车牌 5.骰子 新算子 四、傅里叶变换频域分析 问题一 五、滤波处理 1.均值滤波 2.中值滤波 3.高斯…

【linux基础】Linux 文本处理核心命令指南

Linux 文本处理核心命令指南 文本处理是 Linux 系统管理的核心能力&#xff0c;约 80% 的配置文件操作都依赖于文本处理技术。本指南详细讲解 echo、重定向、cat、grep、wc 和 vim 等关键命令&#xff0c;涵盖从基础操作到高级技巧的完整知识体系&#xff0c;并配有实用案例演示…

基于深度学习YOLOv12的草莓成熟度检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)https://www.bilibili.com/video/BV1

一、项目介绍 本项目构建了一套基于深度学习 YOLOv12 的草莓成熟度识别检测系统&#xff0c;旨在实现对草莓在不同成熟阶段的高精度、实时检测与分类。系统采用 YOLO 格式数据集&#xff0c;将草莓分为 3 个类别&#xff1a;生&#xff08;raw&#xff09;、半熟&#xff08;tu…

深入理解Android Kotlin Flow:响应式编程的现代实践

引言在现代Android开发中&#xff0c;处理异步数据流是一个核心需求。Kotlin Flow作为协程库的一部分&#xff0c;提供了一种声明式的、可组合的异步数据流处理方式。本文将深入探讨Flow的设计理念、核心组件、高级用法以及在实际项目中的最佳实践。一、Flow基础概念1.1 什么是…

功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档&#xff08;一&#xff09; 组建测试团队1、测试团队中的角色2、测试团队的基本责任尽早地发现软件程序、系统或产品中所有的问题…

算法73. 矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 示例 1&#xff1a;输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例2&#xff1a; 输入&#xf…

【力扣22】括号生成

数字n代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且有效的括号组合。 源代码&#xff1a; class Solution { public:int n;vector<string> ans;string path;vector<string> generateParenthesis(int n) {this->n n;d…

ELK分布式日志采集系统

* 系统架构&#xff1a;filebeat 采集各服务器日志&#xff1b;Logstash-docker 过滤整理日志&#xff1b; Elasticsearch-docker 存储和索引数据&#xff1b; Kibana-docker 提供可视化展示和操作。* FileBeat简介&#xff1a;Filebeat是本地文件的日志数据采集器。* Kafka简介…