《glide源碼學習》

前言

正文

  • 設計圖:
    這裏寫圖片描述
  • 流程圖:
    這裏寫圖片描述
  • 類關係圖:
    這裏寫圖片描述

源碼分析

  • 注:這裏寫得會比較亂

  • 筆者看源碼,有個習慣,喜歡按照他鏈式調用去一步一步向下看。

  • Glide類 : Glide.with(context).load(url).into(imageView);

    1.ArrayPool,BitmapPool,BitmapPool 會在trimMemory的時候,釋放資源,由此可見,可是哪個類肯定肯存儲的圖片相關,先放在這裏,後面再細看。

    2.Glide的初始化,跟Picasso類似,Glide的初始化也很有意思。Gilde內部是持有的context.getApplicationContext(),其參數是通過外部類GlideBuilder的createGlide()方法來初始化內部各個變量。然後在通過Glide()的構造函數,把初始化的變量傳遞回來。Glide內部是沒有持有Context的,這種寫法也避免了單例模式的常見的內存泄露寫法。

    3.同Picasso類似, Glide.with(context)返回的也是RequestManager,那我們將進行下一步看RequestManager這個類

    3.Glide在使用介紹的時候,也特別說明了,相對於Picasso,Glide不會持有applicationcontext,會根據fragment,activity的context,進行圖片加載、停止、暫停。因此在內存表現上,更優於Picasso,(使用Picasso會經常出現OOM的異常,不知道大家是否有遇到)。因此,這一點的實現,筆者也是比較好奇的。如何做掉持有context並對lifecycle進行回調的。因此我們也得去RequestManager這個類看一下實現。

  • RequestManager:
    接上面的疑問,如何隨生命週期進行回收\暫停?
    1.Lifecycle : listening to Activity/Fragment lifecycle events. 綁定LifecycleListener生命週期回收監聽事件。
    2.LifecycleListener: void onStart(); void onStop(); void onDestroy();
    3.TargetTracker:內部持有一個weakRefereance,把目標target傳遞進去,然後調用對應LifecycleListener的方法。
    4.RequestManager內部通過track和untrack的方法對目標target的生命週期進行綁定。具體執行綁定的代碼在構造Glide的時候,亦就是GlideBuilder裏面就進行了track進行target的綁定

/————————-分割線———————————–/
2017年1月17日
根據glide生命週期,學着擼了一個庫,對於異步持有的context防內存泄漏的代碼,有着很好的監聽和做對應的釋放操作,類似於RxLifecycle。
https://github.com/cxMax/LifeCycler

發佈了82 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章