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.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簡介…