一、緩存層級與設計目標
-
雙級緩存:
-
內存緩存:弱引用 + LruCache
-
磁盤緩存:DiskLruCache
-
-
設計目標:
-
減少網絡流量消耗
-
避免Bitmap頻繁創建/銷毀引發的GC
-
提升圖片加載速度
-
二、內存緩存機制
1. 雙緩存結構
緩存類型 | 存儲對象 | 數據結構 | 特點 |
---|---|---|---|
弱引用 | 正在使用的圖片 | HashMap | 快速訪問,GC敏感 |
LruCache | 暫時未用的圖片 | LinkedHashMap | LRU算法管理,容量可控 |
2. 關鍵實現原理
-
引用計數器(
EngineResource
):-
acquired
變量記錄引用次數 -
acquire()
:引用+1(圖片使用時調用) -
release()
:引用-1(圖片釋放時調用)
-
-
緩存轉移規則:
if (resource.release()) {// 引用計數=0時:從弱引用移除 → 存入LruCachelruCache.put(key, resource); }
3. 存取流程
-
讀順序:弱引用 → LruCache
-
寫順序:磁盤 → 弱引用 → LruCache(釋放時)
-
設計優勢:
-
分壓策略:弱引用減少LruCache的
trimToSize
頻率(trimToSize
是LruCache(Least Recently Used Cache)中的核心方法,用于強制將緩存大小調整到指定容量范圍內。當緩存數據總量超過預設的最大容量(maxSize)時,該方法會自動移除最近最少使用的條目,直到滿足currentSize <= maxSize
的條件。) -
效率優化:HashMap訪問效率高于LinkedHashMap
-
三、磁盤緩存機制
1. 緩存策略(DiskCacheStrategy)
策略 | 緩存內容 | 適用場景 |
---|---|---|
DATA | 原始圖片數據 | 網絡圖片 |
RESOURCE | 轉換后的圖片(縮放/裁剪) | 本地圖片 |
ALL | DATA + RESOURCE | 遠程圖片完整緩存 |
NONE | 不緩存 | 敏感數據 |
AUTOMATIC(默認) | 智能選擇(遠程:DATA;本地:RESOURCE) | 平衡性能與空間 |
2. 磁盤讀寫流程
-
讀順序:
-
ResourcesCacheGenerator
:查找轉換后的緩存 -
SourceGenerator
:查找原始緩存 -
DataCacheGenerator
:網絡下載并緩存
-
-
寫順序:
網絡 → 磁盤(根據策略緩存DATA/RESOURCE) → 內存
3. 核心類協作
四、緩存流程圖解
正確邏輯梳理
Glide緩存分為內存+磁盤兩級:
1. 內存緩存
采用
弱引用+LruCache
雙結構正在使用的圖片存在弱引用(快速訪問),暫時不用的移入LruCache
通過
acquired
引用計數器實現狀態遷移2. 磁盤緩存
通過
DiskLruCache
實現支持5種策略
讀取順序:轉換后緩存 → 原始緩存 → 網絡下載
3. 整體流程
讀順序:弱引用 → LruCache → 磁盤 → 網絡
寫順序:網絡 → 磁盤 → 弱引用 → LruCache(釋放時)
4.設計亮點:
弱引用分壓減少LruCache擴容壓力
引用計數器精準管理內存生命周期
磁盤緩存策略靈活適配不同場景