1. 程式人生 > >Glide 原始碼解析

Glide 原始碼解析

泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。Glide和Picasso使用上有90%的相似度,但是內部實現機制有很大區別 Glide介紹

1.主要特點

(1)支援Memory和Disk圖片快取。
(2)支援gif和webp格式圖片。
(3)根據Activity/Fragment生命週期自動管理請求。
(4)使用Bitmap Pool可以使Bitmap複用。
(5)對於回收的Bitmap會主動呼叫recycle,減小系統回收壓力。

2. 總體設計

總體設計圖

基本概念

RequestManager:請求管理,每一個Activity都會建立一個RequestManager,根據對應Activity的生命週期管理該Activity上所以的圖片請求。

Engine:載入圖片的引擎,根據Request建立EngineJob和DecodeJob。

EngineJob:圖片載入。

DecodeJob:圖片處理。

流程圖

這裡是大概的總體流程圖, 具體的細節中流程下面繼續分析。
總體流程圖

3. 核心類介紹

3.1 Gilde 
用於儲存整個框架中的配置。

重要方法:

  1. public
    staticRequestManagerwith(FragmentActivityactivity){
  2. RequestManagerRetrieverretriever=RequestManagerRetriever.get();
  3. returnretriever.get(activity);
  4. }

用於建立RequestManager,這裡是Glide通過Activity/Fragment生命週期管理Request原理所在,這個類很關鍵、很關鍵、很關鍵,重要的事情我只說三遍。
主要原理是建立一個自定義Fragment,然後通過自定義Fragment生命週期操作RequestManager,從而達到管理Request。

RequestManager建立流程圖

3.2 RequestManagerRetriever

  1. RequestManagersupportFragmentGet(Contextcontext,FragmentManagerfm){
  2. SupportRequestManagerFragmentcurrent=getSupportRequestManagerFragment(fm);
  3. RequestManagerrequestManager=current.getRequestManager();
  4. if(requestManager==null){
  5. requestManager=newRequestManager(context,current.getLifecycle(),current.getRequestManagerTreeNode());
  6. current.setRequestManager(requestManager);
  7. }
  8. returnrequestManager;
  9. }

這裡判斷是否只當前RequestManagerFragment是否存在RequestManager,保證一個Activity對應一個RequestManager, 這樣有利於管理一個Activity上所有的Request。建立RequestManager的時候會將RequestManagerFragment中的回撥介面賦值給RequestManager,達到RequestManager監聽RequestManagerFragment的生命週期。

3.3 RequestManager
成員變數:
(1)Lifecycle lifecycle,用於監聽RequestManagerFragment生命週期。
(2)RequestTracker requestTracker, 用於儲存當前RequestManager所有的請求和帶處理的請求。

重要方法:

  1. @Override
  2. //開始暫停的請求
  3. publicvoidonStart(){
  4. resumeRequests();
  5. }
  6. //停止所有的請求
  7. @Override
  8. publicvoidonStop(){
  9. 相關推薦

    Glide 原始碼解析

    泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。Glide和Picasso使用上有90%的相似度,但是內部實

    Glide原始碼解析篇之框架主體結構(一)

          Gide作為Android最受歡迎的圖片載入庫之一,一直深受Android開發者的喜愛,很大原因就是它的功能極其強大,而使用卻異常簡單。無論是網路、快取、特效,佔位圖,Glide團隊都為開發者考慮的非常細緻,也正因為這個原因,Glide框架的原始碼變得極其複雜,

    Android Glide原始碼解析

    功能介紹 由於這篇文章使用glide的老版本,因此有些使用方法可能不太一致了。 本文基於github上Glide最新程式碼4.0.0版本做解析。 最基本的使用方式如下: Glide.with(this) .asDr

    Glide原始碼解析一,初始化

    轉載請標明出處:https:////www.cnblogs.com/tangZH/p/12409849.html Glide作為一個強大的圖片載入框架,已經被android官方使用,所以,明白Glide的載入流程以及原理對加深我們對glide的理解是很重要的。 本文基於glide 4.11 Glide.wi

    Glide原始碼(基於4.8版本)解析

     Glide是一款由Bump Technologies開發的圖片載入框架,使得我們可以在Android平臺上以極度簡單的方式來載入和展示圖片。  使用Glide來載入網路圖片非常簡單,通過Glide.with(this).load(url).into(imageView)這樣的一句程式碼

    Glide載入圖片流程原始碼解析

    網上Glide原始碼解析的資料比較多,但魚龍混雜,so我決定還是自己跟一遍原始碼吧,看原始碼真的是一件爆炸的事,好幾次想放棄,但最後還是堅持下來了,唉。 首先先來捋一遍Glide的具體用法,從具體用法出發我們再來分析Glide內部都是怎麼來實現這些方法的。

    Netty進階:Futrue&Promise原始碼解析

    文章目錄 1. Future&Promise 2. AbstractFuture 3.Completefuture 4.Channelfuture&Completechannel

    大資料基礎(1)zookeeper原始碼解析

    五 原始碼解析   public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING;}zookeeper伺服器狀態:剛啟動LOOKING,follower是FOLLOWING,leader是LEADING,observer是

    Android框架原始碼解析之(四)Picasso

    這次要分析的原始碼是 Picasso 2.5.2 ,四年前的版本,用eclipse寫的,但不影響這次我們對其原始碼的分析 地址:https://github.com/square/picasso/tree/picasso-parent-2.5.2 Picasso的簡單使用

    Android框架原始碼解析之(三)ButterKnife

    注:所有分析基於butterknife:8.4.0 原始碼目錄:https://github.com/JakeWharton/butterknife 其中最主要的3個模組是: Butterknife註解處理器https://github.com/JakeWharton/

    Android框架原始碼解析之(二)OKhttp

    原始碼在:https://github.com/square/okhttp 包實在是太多了,OKhttp核心在這塊https://github.com/square/okhttp/tree/master/okhttp 直接匯入Android Studio中即可。 基本使用:

    Android框架原始碼解析之(一)Volley

    前幾天面試CVTE,HR面掛了。讓內部一個學長幫我查看了一下面試官評價,發現二面面試官的評價如下: 廣度OK,但缺乏深究能力,深度與實踐不足 原始碼:只能說流程,細節程式碼不清楚,retrofit和volley都是。 感覺自己一方面:自己面試技巧有待提高吧(框

    HashMap原始碼解析(JDK8)

    前言 這段時間有空,專門填補了下基礎,把常用的ArrayList、LinkedList、HashMap、LinkedHashMap、LruCache原始碼看了一遍,List相對比較簡單就不單獨介紹了,Map準備用兩篇的篇幅,分別介紹HashMap和(LruCache+LinkedHa

    原始碼解析--Long、long型別的比較遇到的問題

    Long、long型別的比較遇到的問題: 1、long 是基本型別 Long是物件型別。 public static void main(String[] args) { Long A = 127l; Long B = 127l; long C = 127; l

    CopyOnWriteArrayList實現原理以及原始碼解析

    CopyOnWriteArrayList實現原理以及原始碼解析 1、CopyOnWrite容器(併發容器) Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。 其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才

    LinkedList實現原理以及原始碼解析(1.7)

    LinkedList實現原理以及原始碼解析(1.7) 在1.7之後,oracle將LinkedList做了一些優化, 將1.6中的環形結構優化為了直線型了連結串列結構。 1、LinkedList定義: public class LinkedList<E>

    ArrayList實現原理以及原始碼解析(補充JDK1.7,1.8)

    ArrayList實現原理以及原始碼解析(補充JDK1.7,1.8) ArrayList的基本知識在上一節已經討論過,這節主要看ArrayList在JDK1.6到1.8的一些實現變化。 JDK版本不一樣,ArrayList類的原始碼也不一樣。 1、ArrayList類結構:

    ArrayList實現原理以及原始碼解析(JDK1.6)

    ArrayList實現原理以及原始碼解析(JDK1.6) 1、ArrayList ArrayList是基於陣列實現的,是一個動態陣列,其容量能自動增長,類似於C語言中的動態申請記憶體,動態增長記憶體。 ArrayList不是執行緒安全的,只能用在單執行緒環境下。

    ConcurrentHashMap實現原理以及原始碼解析

    ConcurrentHashMap實現原理以及原始碼解析 ConcurrentHashMap是Java1.5中引用的一個執行緒安全的支援高併發的HashMap集合類。 1、執行緒不安全的HashMap 因為多執行緒環境下,使用Hashmap進行put操作會引起死迴圈

    Java併發程式設計高階技術-高效能併發框架原始碼解析與實戰(資源同步)

    第1章 課程介紹(Java併發程式設計進階課程) 什麼是Disruptor?它一個高效能的非同步處理框架,號稱“單執行緒每秒可處理600W個訂單”的神器,本課程目標:徹底精通一個如此優秀的開源框架,面試秒殺面試官。本章會帶領小夥伴們先了解課程大綱與重點,然後模擬千萬,億級資料進行壓力測試。讓大