Android中Glide.with().load().into() 應付面試源碼解析

1.?with(this):生命周期綁定
Glide.with(Activity/Fragment/Context)
  • 核心機制:創建與 UI 生命周期綁定的?RequestManager

  • 底層實現

    • 通過?RequestManagerRetriever?獲取單例

    • 非 Application 上下文

      • 向 Activity/Fragment 添加隱藏 FragmentRequestManagerFragment

      • 通過 Fragment 生命周期回調控制請求(頁面銷毀時自動取消加載)

    • Application 上下文:使用全局生命周期

  • 設計意圖:解決內存泄漏問題,實現請求與頁面生命周期同步


2.?load(url):構建數據模型
.load(String url)
  • 核心流程

    1. 創建?DrawableTypeRequest?對象

    2. 初始化?ModelLoader

      • String.class?→?StreamStringLoader(處理網絡流)

      • 最終組合為?ImageVideoModelLoader(支持流 + 文件描述符雙通道)

    3. 封裝參數:

      • URL 數據源

      • 解碼器(ImageVideoGifDrawableLoadProvider

      • 轉碼器(GifBitmapWrapperDrawableTranscoder

  • 關鍵設計:通過泛型抽象支持多種數據源(URL/文件/資源ID等)


3.?into(imageView):加載與渲染
.into(ImageView)
??階段1:初始化
  1. 將?ImageView?封裝為?TargetGlideDrawableImageViewTarget

  2. 構建?GenericRequest?對象(整合 URL/Target/緩存策略等參數)

??階段2:緩存檢查

??階段3:網絡加載(未命中緩存時)
  1. 網絡層

    • 使用?HttpUrlFetcher(基于?HttpURLConnection

    • 支持自動重定向(最大 5 次跳轉)

    // 核心下載邏輯
    HttpURLConnection connection = url.openConnection();
    InputStream is = connection.getInputStream();
  2. 解碼流程

    • 通過?ImageVideoGifDrawableLoadProvider?選擇解碼器

    • 靜態圖

      • StreamBitmapDecoder?→?Downsampler.decode()(處理尺寸采樣/旋轉)

      • 最終得到?BitmapResource

    • GIF

      • GifResourceDecoder?→ 生成?GifDrawable

    • 統一封裝為?GifBitmapWrapper

  3. 轉碼適配

    • GifBitmapWrapperDrawableTranscoder?統一轉碼為?GlideDrawable

      • 靜態圖 →?GlideBitmapDrawable

      • GIF →?GifDrawable

??階段4:線程切換與渲染
  1. 切主線程

    • 通過?Handler(Looper.getMainLooper())?切換線程

    // EngineJob 中的線程切換
    MAIN_THREAD_HANDLER.obtainMessage(MSG_COMPLETE, this).sendToTarget();

  2. 渲染到 ImageView

    // GlideDrawableImageViewTarget 最終調用
    imageView.setImageDrawable(glideDrawable);
  3. GIF 處理

    • 調用?GifDrawable.start()?啟動動畫


關鍵核心設計

  1. 三級緩存體系

    • 活動資源(Active Resources)→ 內存緩存(LRC)→ 磁盤緩存(DiskLRU)

    • 緩存Key生成規則:URL + 尺寸 + 變換簽名

  2. 資源復用優化

    • BitmapPool?復用 Bitmap 內存,減少 GC

    Bitmap reusedBitmap = bitmapPool.get(width, height, config);
  3. 生命周期自動化

    • 通過隱藏 Fragment 實現請求自動取消

  4. 模塊化擴展

    • 支持自定義?ModelLoader(擴展數據源)

    • 支持自定義?Transformation(圖片變換)

  5. 智能尺寸計算

    • 自動讀取 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 頻率

  • 生命周期自動化管理避免內存泄漏

  • 模塊化設計支持靈活擴展

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88081.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

#### es相關內容的索引 ####

倒排索引 結構 #### es倒排索引的結構 ####-CSDN博客 向量索引 結構應用 #### es向量檢索 的 結構及應用_es 向量 文本檢索-CSDN博客 ann算法 ann算法的種類有哪些,之間的區別,各自的適用場景-CSDN博客 地理信息索引 es地理信息索引的類型以及geo_po…

小飛電視:智能電視與移動設備的娛樂新選擇

在數字娛樂時代,人們對于影視內容的需求日益增長,不僅追求豐富多樣的節目選擇,還希望獲得便捷、個性化的觀看體驗。小飛電視正是這樣一款專為智能電視和移動設備設計的視頻娛樂應用,它憑借海量的影視資源、高清流暢的播放效果以及…

刪除node并且重裝然后重裝vue

參考第一篇文章 node.js卸載與安裝超詳細教程_node卸載重裝-CSDN博客 第二篇文章安裝vue Vue安裝與配置教程(非常詳細)_安裝vue-CSDN博客

基于YOLOv10算法的交通信號燈檢測與識別

目錄 一.🦁 寫在前面1.1 實現模塊劃分1.2 優化與實時性支持 二.🦁 相關技術與理論基礎2.1 各版本yolo對比2.2 YOLOv10網絡結構 三.🦁 結果分析3.1 訓練損失與驗證損失分析3.2 精確率(Precision)、召回率(Re…

洪水風險圖制作全流程:HEC-RAS 與 ArcGIS 的耦合應用

技術點目錄 一、HER-RAS理論二、一維數學模型基本地形導入三、恒定流、非恒定流一維數學模型水流計算四、一維數學模型計算結果分析五、一維數學模型增設構筑物六、二維河道水動力模擬七、HEC-RAS在潰壩模型中的應用八、HEC-RAS在洪水風險圖中的應用了解更多 —————————…

視覺大語言模型未能充分利用視覺表征

視覺大語言模型未能充分利用視覺表征 FesianXu 20250612 at Wechat Search Team 前言 這兩天看到一篇新掛在arxiv上的文章 [1],討論了下視覺大語言模型的視覺表征退化問題。先前的研究將VLM缺陷歸咎于視覺編碼器薄弱,并提出集成編碼器方案以彌補不足&am…

SSRF3 任意文件讀取

一.任意文件讀取 http://192.168.112.12/pikachu-master/vul/ssrf/ssrf_curl.php?urlfile:///etc/passwd 讀取文件使用 file://文件路徑即可,這里我們換協議為file,然后從根目錄開始讀取。 /etc/passwd 我們這樣修改完url路徑后查看結果可以看到文件內…

洛谷P3953 [NOIP 2017 提高組] 逛公園

洛谷P3953 [NOIP 2017 提高組] 逛公園 洛谷題目傳送門 題目背景 NOIP2017 D1T3 題目描述 策策同學特別喜歡逛公園。公園可以看成一張 N N N 個點 M M M 條邊構成的有向圖,且沒有 自環和重邊。其中 1 1 1 號點是公園的入口, N N N 號點是公園的出…

Vue3+TypeScript+Element Plus 表格展開行優化方案

在 Vue3 TypeScript Element Plus 項目中優化表格展開行的內存使用,主要從 渲染優化、數據管理 和 內存回收 三方面入手。以下是最佳實踐和完整解決方案: 1. 懶加載展開內容(核心優化) 只當行展開時才渲染內容,避免…

OpenCV——直方圖與匹配

直方圖與匹配 一、直方圖簡介二、直方圖統計三、直方圖比較四、直方圖均衡化五、自適應的直方圖均衡化六、直方圖反向投影七、模板匹配 一、直方圖簡介 圖像直方圖(Histogram)是一種頻率分布圖,它描述了不同強度值在圖像中出現的頻率。圖像直…

通義大模型在文檔自動化處理中的高效部署指南(OCR集成與批量處理優化)

1. 傳統OCR解決方案常面臨識別精度低、版面分析能力弱、處理效率瓶頸等問題。通義大模型憑借其多模態理解和生成能力,為文檔處理領域帶來革命性突破。本文將深入探討如何高效部署通義大模型實現端到端的文檔自動化處理,特別聚焦OCR集成與批量處理優化兩…

Ubuntu20.04通過ssh協議配置遠程終端

一、在目標計算機(即被連接的計算機)上操作: 1、安裝 OpenSSH 服務器: sudo apt update sudo apt install openssh-server3、啟動并設置 SSH 服務開機自啟: sudo systemctl enable --now ssh二、在源計算機&#xf…

《HTTP權威指南》 第7章 緩存

帶著問題學習: 緩存如何提高性能如何衡量緩存的有效性緩存置于何處作用最大HTTP如何保持緩存副本的新鮮度緩存如何與其他緩存及服務器通信 web緩存是可以自動保存常見文檔副本的HTTP設備。 緩存優點 減少冗余的數據傳輸,節省網絡費用緩解網絡瓶頸問題&…

第十三章 模板

函數模板 函數模板使用 函數模板注意事項 自動類型推導,必須推導出一致的數據類型T,才可以使用 模板必須要確定出T的數據類型,才可以使用 普通函數和函數模板的類型轉化 普通函數隱式類型轉化(char轉int) 函數模板正常使用不會發生…

云計算-專有網絡VPC

🌐 什么是 VPC?(Virtual Private Cloud) VPC(Virtual Private Cloud,虛擬私有云) 是公有云服務商提供的一種網絡隔離服務,允許用戶在云中創建一個邏輯隔離的私有網絡環境。你可以在這…

關于*gin.Context的理解

關于*gin.Context的理解 作為初學者,在學習go語言用gin開發web時,我對*gin.Context感到困惑。本文章以自我總結為主,大部分為來自詢問ai后的總結,如有問題歡迎指出。 *gin.Context可以理解為一個gin框架的上下文對象指針&#x…

Qt中的OpenGL (6)[坐標系統]

文章目錄 文章說明學習目標目錄結構坐標系統局部空間世界空間觀察空間裁剪空間正射投影矩陣透視投影矩陣組合進入3D世界頂點數據著色器設置數據矩陣設置文章說明 本文是學習OpenGL的筆記,主要參考大神JoeyDeVries的LearnOpenGL第八課《坐標系統》,并將教程中的代碼基于Qt進行…

Spring Aop @After (后置通知)的使用場景?

核心定義 After 是 Spring AOP 中的另一種通知(Advice)類型,通常被稱為“后置通知”或“最終通知”。 它的核心作用是: 無論目標方法是正常執行完成,還是在執行過程中拋出了異常,After 通知中的代碼 總是…

UNet改進(4):交叉注意力(Cross Attention)-多模態/多特征交互

在計算機視覺領域,UNet因其優異的性能在圖像分割任務中廣受歡迎。本文將介紹一種改進的UNet架構——UNetWithCrossAttention,它通過引入交叉注意力機制來增強模型的特征融合能力。 1. 交叉注意力機制 交叉注意力(Cross Attention)是一種讓模型能夠動態地…

C#里從CSV文件加載BLOB數據字段到數據庫的處理

大量的數據保存在CSV文件, 當需要把這些數據加載到數據庫,然后使用數據庫來共享出去。 就需要把CSV文件導入數據庫, 怎么樣快速地把CSV文件導入數據庫呢? 這個就需要使用類MySqlBulkLoader,它是mariadb數據庫快速導入的方式。 一般使用SQL語句導入是10秒,那么使用這種方…