1.?with(this)
:生命周期綁定
Glide.with(Activity/Fragment/Context)
-
核心機制:創建與 UI 生命周期綁定的?
RequestManager
-
底層實現:
-
通過?
RequestManagerRetriever
?獲取單例 -
非 Application 上下文:
-
向 Activity/Fragment 添加隱藏 Fragment(
RequestManagerFragment
) -
通過 Fragment 生命周期回調控制請求(頁面銷毀時自動取消加載)
-
-
Application 上下文:使用全局生命周期
-
-
設計意圖:解決內存泄漏問題,實現請求與頁面生命周期同步
2.?load(url)
:構建數據模型
.load(String url)
-
核心流程:
-
創建?
DrawableTypeRequest
?對象 -
初始化?
ModelLoader
:-
String.class
?→?StreamStringLoader
(處理網絡流) -
最終組合為?
ImageVideoModelLoader
(支持流 + 文件描述符雙通道)
-
-
封裝參數:
-
URL 數據源
-
解碼器(
ImageVideoGifDrawableLoadProvider
) -
轉碼器(
GifBitmapWrapperDrawableTranscoder
)
-
-
-
關鍵設計:通過泛型抽象支持多種數據源(URL/文件/資源ID等)
3.?into(imageView)
:加載與渲染
.into(ImageView)
??階段1:初始化
-
將?
ImageView
?封裝為?Target
(GlideDrawableImageViewTarget
) -
構建?
GenericRequest
?對象(整合 URL/Target/緩存策略等參數)
??階段2:緩存檢查
??階段3:網絡加載(未命中緩存時)
-
網絡層:
-
使用?
HttpUrlFetcher
(基于?HttpURLConnection
) -
支持自動重定向(最大 5 次跳轉)
// 核心下載邏輯 HttpURLConnection connection = url.openConnection(); InputStream is = connection.getInputStream();
-
-
解碼流程:
-
通過?
ImageVideoGifDrawableLoadProvider
?選擇解碼器 -
靜態圖:
-
StreamBitmapDecoder
?→?Downsampler.decode()
(處理尺寸采樣/旋轉) -
最終得到?
BitmapResource
-
-
GIF:
-
GifResourceDecoder
?→ 生成?GifDrawable
-
-
統一封裝為?
GifBitmapWrapper
-
-
轉碼適配:
-
GifBitmapWrapperDrawableTranscoder
?統一轉碼為?GlideDrawable
-
靜態圖 →?
GlideBitmapDrawable
-
GIF →?
GifDrawable
-
-
??階段4:線程切換與渲染
-
切主線程:
-
通過?
Handler(Looper.getMainLooper())
?切換線程
// EngineJob 中的線程切換 MAIN_THREAD_HANDLER.obtainMessage(MSG_COMPLETE, this).sendToTarget();
-
-
渲染到 ImageView:
// GlideDrawableImageViewTarget 最終調用 imageView.setImageDrawable(glideDrawable);
-
GIF 處理:
-
調用?
GifDrawable.start()
?啟動動畫
-
關鍵核心設計
-
三級緩存體系:
-
活動資源(Active Resources)→ 內存緩存(LRC)→ 磁盤緩存(DiskLRU)
-
緩存Key生成規則:URL + 尺寸 + 變換簽名
-
-
資源復用優化:
-
BitmapPool
?復用 Bitmap 內存,減少 GC
Bitmap reusedBitmap = bitmapPool.get(width, height, config);
-
-
生命周期自動化:
-
通過隱藏 Fragment 實現請求自動取消
-
-
模塊化擴展:
-
支持自定義?
ModelLoader
(擴展數據源) -
支持自定義?
Transformation
(圖片變換)
-
-
智能尺寸計算:
-
自動讀取 View 的 layout_width/layout_height
-
通過?
ViewTarget.getSize()
?計算適配尺寸
-
面試級回答模板
Glide.with().load().into()
?的核心流程:1. 生命周期綁定(with)
通過隱藏 Fragment 綁定頁面生命周期,確保頁面銷毀時自動釋放資源
2. 數據建模(load)
創建?
ModelLoader
?處理不同類型數據源(URL 對應?StreamStringLoader
)封裝為可配置的?
DrawableTypeRequest
3. 加載渲染(into)
緩存檢查:三級緩存依次查詢(活動緩存 → 內存 → 磁盤)
網絡下載:未命中時通過?
HttpUrlFetcher
?下載數據流解碼處理:根據圖片類型選擇解碼器(靜態圖用?
Downsampler
?處理尺寸采樣)統一轉碼:轉換為?
GlideDrawable
?兼容靜圖/GIF線程切換:通過 Handler 切主線程渲染到 ImageView
GIF 處理:自動調用?
start()
?播放動畫設計優勢:
三級緩存減少網絡請求
BitmapPool 復用內存降低 GC 頻率
生命周期自動化管理避免內存泄漏
模塊化設計支持靈活擴展