一 緩存策略
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. 實戰判斷邏輯
綜合起來,可以這樣判斷:
- 先用 onlyRetrieveFromCache(true) 提前檢測是否有磁盤緩存(可做預加載優化判斷)。
- 加載時用 RequestListener 獲取真實加載來源(內存/磁盤/網絡)。
- 配合 Glide 日志 雙重驗證。
三 Glide緩存流程圖
四 總結
- 緩存策略有五種:ALL,DATA,RESOURCE,NONE,AUTOMATIC(默認),即原圖緩存、轉換后緩存,原圖緩存,轉換后緩存,不緩存,由glide處理緩存策略。
- 緩存命中,可以通過日志查看,RequestListener 和onlyRetrieveFromCache(true) 來查看是否命中了緩存