【Android面試技巧】當面試官問你glide的時候,是想問什麼?glide生命週期如何實現?
去面試的時候,我們也經常被問到這樣的問題:專案用什麼圖片載入框架?為什麼選擇這個框架?glide是現在主流的圖片載入框架,被問到的機率非常高。面試官這樣問,最想聽到的是什麼答案?Lru演算法原理還是三層快取的理解?以我的理解,Lru和三層快取是很基本的,一般的圖片載入框架都用到,這應該不是面試官真正的目的。 面試官最想問的應該是glide最大的優點是什麼?並且能夠針對原始碼講出是怎麼實現的。本篇文章將圍繞這兩個問題去討論。
說在前面的話
glide的原始碼對於我來說,很複雜。一開始覺得雲裡霧裡,後來看了很多遍才理順。寫這篇文章是抓住主線去講述,很多的細節沒有講到,而且是按照我自己認為更好理解的順序去看原始碼。看過原始碼卻還是很暈的朋友們可以看下我的思路,也許有用。如果沒有看過原始碼的,可以去看其它大神寫的關於glide的系列文章,會更好。整篇文章只針對glide的with()傳入Activity環境變數作講解。
glide最大的優點
glide最大的優勢就是對bitmap的管理是跟隨生命週期去發生改變的。其它的框架基本都是用Lru演算法,當Activity銷燬的時候,是不會釋放之前載入圖片佔用的所有記憶體。glide的優勢就是當Activity銷燬的時候,之前載入的所有圖片的記憶體都釋放了。glide是如何做得這一點的,這是我們需要去深挖的地方。
glide如何監聽到Activity的生命週期
在看glide相關資料的時候,知道一個結論,glide是透過新建一個空的Fragment去監聽Activity的生命週期。帶著這個結論然後按呼叫的步驟看原始碼,結果被繞暈了,各種呼叫和類,看了很多次還是很混亂。後來我換個思路,如果簡化的來說,就是新建的Fragment和當前的Activity關聯上,glide根據Fragment的生命週期去做操作,
onStart()``發起請求或者重新請求、
onStop()暫停請求、``onDestory()`取消清除請求。所以我先找出新建的Fragment,然後順著思路,去檢視它在哪裡和Actvity關聯上。
首先找到Fragment,也就是RequestManagerFragment,內部建立的無UI的Fargment。它在RequestManagerRetriever類的getRequestManagerFragment()被呼叫。相關原始碼:
這部分程式碼涉及FragmentManager的使用,忘了怎麼使用的朋友可以去複習一下。 程式碼不難理解,就是一個目的,得到Fragment並且返回這個Fragment。先透過findFragmentByTag獲取,如果為null,則會從pendingRequestManagerFragments這個Map集合去獲取,如果還是為null,則直接new 一個Fragment,並且儲存到pendingRequestManagerFragments以及新增到Activity中。 這部分的程式碼就是Fragment和Actvity關聯上了,這樣就可以透過Fragment得知當前Activty的生命週期。追蹤RequestManagerFragment,看看它的生命週期裡面做了什麼操作,原始碼如下:
Fragment的的生命週期裡(我們只關注貼出程式碼的三個生命週期),ActivityFragmentLifecycle類都呼叫了相同名字的方法,接下來看看ActivityFragmentLifecycle的相應方法裡面有什麼操作。
相應的方法裡都呼叫了LifecycleListener的相關方法,LifecycleListener是一個介面,作用在原始碼裡寫得很清楚:
An interface for listener to lifecycle events.
,監聽生命週期的介面。既然是個介面,就找出實現它的類,實現LifecycleListener的類是RequestManager。RequestManager類,它實現了LifecycleListener介面,三個方法裡面的內容如下。
requestTracker是用來追蹤取消和重新啟動正在進行,已完成和失敗的請求。看到這裡我們可以猜想,RequestManagerFragment生命週期變化的時候回撥RequestManager的onStart、onStop、onDestroy方法,然後Request就做出相應的操作,Activity的生命週期是和Request的生命週期繫結起來。要驗證這個猜想,就要找到RequestManager是怎麼樣監聽到Fragment的生命週期的。我們來看看RequestManager的建立
以上程式碼說明,透過工廠模式建立RequestManager,並且將Fragment的lifecycle交給RequestManager管理,程式碼
current.getGlideLifecycle()
就是獲取到lifecycle。再回頭去看ReqeustManager,找到了lifecycle操作LifecycleListener的程式碼,在構造器將LifecycleListener新增到lifecycle,原始碼如下:
Lifecycle是用來新增和刪除LifecycleListener,而ReqeustManager的構造方法裡,將LifecycleListener新增到lifecycle裡面。
看到這裡,也就驗證了我們的猜想了。ReqeustManager是來代理管理Request的生命週期方法,也就是請求的生命週期。glide就是透過ReqeustManager監聽到Fragment的生命週期,從而根據生命週期管理讓Request做出相對應的請求。
我們在使用glide的時候很簡單,就是
Glide.with(this).load(url).into(imageView);
glide的with方法返回的也是ReqeustManager類,這個過程中按順序看下來,涉及兩個關鍵方法,
fragmentGet()
和
getRequestManagerFragment()
,相關的原始碼已經在以上講解中貼出。
下面我將把獲取到ReqeustManager這個過程中涉及的一些重要的方法和類做一些說明,只是我的個人理解,如有不對,歡迎指正。
fragmentGet()
1、呼叫getRequestManagerFragment()得到RequestManagerFragment,也就是Fragment的管理類。 從RequestManagerFragment拿到RequestManager和ActivityFragmentLifecycle
2、RequestManager如果不為空直接返回,如果為空則透過工廠建立一個RequestManager,並且將ActivityFragmentLifecycle傳入。
getRequestManagerFragment()
1、得到RequestManagerFragment,也就是Fragment
2、將Fragment加入到Activity
RequestManagerFragment
1、Fragment的管理類,繼承Fragment
2、在構造方法裡建立ActivityFragmentLifecycle類
3、在Fragment的onStart()、onStop()、onDestroy()裡呼叫ActivityFragmentLifecycle類裡相應的方法。
ActivityFragmentLifecycle
1、實現Lifecycle介面
2、在Lifecycle的
addListener(@NonNull LifecycleListener listener)
;裡,將listener一一新增進LifecycleListener的集合,並且呼叫LifecycleListener相應的方法做一些操作,最終的目的是讓每個RequestManager對應一個LifecycleListener
RequestManager
1、實現LifecycleListener介面
2、將RequestManager自身新增到lifecycle方法中,也就是ActivityFragmentLifecycle中,這樣就可以監聽到Fragment的生命週期。
glide還有很多很多的知識點,本篇文章只是介紹glide是如何關聯上Activity的生命週期的,當我們在面試時候,能把實現的過程講出來,我想這是會加分的。看懂原始碼,也就能在 面試過程中針對不同的問題去解答。
最後
要想面試成功進大廠,面試前的準備肯定是要很充分的。
而自己的知識準備得怎麼樣,這直接決定了你能否順利透過一面和二面,所以在面試前來一個知識梳理,看需不需要提升自己的知識儲備是很有必要的。
關於 知識梳理,這裡再分享一下我面試這段時間的複習路線:(以下體系的複習資料是我從各路大佬收集整理好的)
知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結:
《379頁Android開發面試寶典》
歷時半年,我們整理了這份市面上最全面的安卓面試題解析大全
包含了騰訊、百度、小米、阿里、樂視、美團、58、360、新浪、搜狐等一線網際網路公司面試被問到的題目。熟悉本文中列出的知識點會大大增加透過前兩輪技術面試的機率。
如何使用它?
1.可以透過目錄索引直接翻看需要的知識點,查漏補缺。
2.五角星數表示面試問到的頻率,代表重要推薦指數
《507頁Android開發相關原始碼解析》
只要是程式設計師,不管是Java還是Android,如果不去閱讀原始碼,只看API文件,那就只是停留於皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。
真正最能鍛鍊能力的便是直接去閱讀原始碼,不僅限於閱讀各大系統原始碼,還包括各種優秀的開源庫。
資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖,以上資源均免費分享,以上內容均放在了開源專案: 【 github 】 中已收錄,大家可以自行獲取。
最後祝大家面試順利,早日找到自己心儀的公司。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983917/viewspace-2732233/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 當面試官問你這個問題的時候,他想聽到什麼?面試
- 當面試官說“你還有什麼問題想問的”,你該如何回答?面試
- 當面試官說 “你還有什麼問題想問的” ,你該如何回答?面試
- 當面試官說 “你還有什麼問題想問的”,你該如何回答?面試
- 面試官:你還有什麼想問我的?面試
- 如何繫結頁面生命週期(一)-Glide實現IDE
- 面試官:說說你對react生命週期的理解面試React
- 當面試官問執行緒池時,你應該知道些什麼?面試執行緒
- 面試時,面試官問:你以後的規劃是怎樣的 如何回答呢面試
- 面試官:簡歷上最好不要寫Glide,不是問原始碼那麼簡單面試IDE原始碼
- 當面試官問你如何進行效能優化時,你該這麼回答(一)面試優化
- 面試官問你基本型別時他想知道什麼面試型別
- 詢問面試官的面試問題面試
- 面試官問:你知道Redis能做什麼?不能做什麼?面試Redis
- 面試被問到你為此次面試都做了哪些準備,面試官想考察的點時什麼,測試開發崗位。面試
- 面試官問:什麼是布隆過濾器?面試過濾器
- 如何解釋vue的生命週期才能令面試官滿意?Vue面試
- 圖解 Java 執行緒的生命週期,看完再也不怕面試官問了圖解Java執行緒面試
- 面試官問我:什麼是JavaScript閉包,我該如何回答面試JavaScript
- 你以為面試官在問深拷貝的時候,僅僅是在問深拷貝嗎?面試
- 當面試官問我JDK Semaphore的原理時,我笑了面試JDK
- 技術面試中,當面試官「套路」你時,怎麼「反套路」回去?面試
- 面試官問:ThreadLocal中的鍵為什麼是弱引用?面試thread
- 美團面試官問我: ZGC 的 Z 是什麼意思面試GC
- Go 面試官問我如何實現物件導向?Go面試物件
- 面試官,你再問我 Bit Operation 試試?面試
- 面試時,面試官到底在考察什麼?面試
- 面試Spring之bean的生命週期面試SpringBean
- 當面試官問出“Unsafe”類時,我就知道這場面試廢了,祖墳都能給你問出來!面試
- 當面試官問你Vue響應式原理,你可以這麼回答他面試Vue
- 面試官:Vue 的生命週期之間到底做了什麼事清?(原始碼詳解)面試Vue原始碼
- 當面試遇到 Redis,我作為一個面試官是這麼“刁難”你的!面試Redis
- 反問面試官:如何實現叢集內選主面試
- 答面試官問:怎麼實現介面冪等性面試
- Android JVM面試專題:阿里100%會問到的JVM,20道靈魂質問面試題解析,讓你吊打面試官AndroidJVM阿里面試題
- 面試官問你斐波那契數列的時候不要高興得太早面試
- 面試官問我HTTP,我真的是面試HTTP
- 問問那些變態的面試官面試