Glide 三部曲之請求生命周期管控

  • 本文章所使用的 Glide 源碼版本:4.11.0

源碼解析

  • 在講源碼之前,我們先復(fù)習(xí)一下 Glide 的用法
  • 主要分成三部曲:傳入 Activity 或者 Fragment、傳入圖片地址、傳入目標的 ImageView

  • 我們先講講 Glide 的生命周期控制,也就是 Glide.with 方法,讓我們簡單看一下里面的源碼

  • 我們可以看到,Glide.with 復(fù)寫了多個不同參的方法,那么問題來了,這些方法有什么不一樣,Glide 又拿它們做了什么事?

  • 帶著這個疑問,我們先進入 Glide.with(FragmentActivity activity) 的源碼里面看看

  • 通過查看這幾段源碼,我們可以得出一個結(jié)論,Glide 拿到 FragmentActivity 的用處是為了在 Activity 里面創(chuàng)建一個 Fragment,那么問題又來了,它創(chuàng)建 Fragment 是要做什么事?接下來讓我們繼續(xù)追蹤一下源碼。
  • 看到這里,我想大多數(shù)人的想法跟我一樣,想看這個 Fragment 到底長啥樣?
  • 通過搜索關(guān)鍵字,我們基本可以斷定這個是一個無界面的 Fragment,也可以認為是一個透明的 Fragment,那么 Glide 到底是想做什么?
  • 接下來讓我們把目光放到一個類上面,ActivityFragmentLifecycle,光看名字就知道這個是我們要講的主角之一:生命周期管理,接下來我們看看這個類在 Fragment 里面做了什么事
  • 那么問題又來了,Glide 這樣做的目的又是什么?是為了解決什么問題而做的?

  • 這個問題非常值得我們?nèi)ニ伎?,首先我們要知道,Glide 是通過網(wǎng)絡(luò)請求獲取圖片的資源,網(wǎng)絡(luò)請求是異步的,也就是必須在子線程中,而 Activity 是運行在主線程中,正常的情況是 Glide 請求完畢之后 Activity 再銷毀,但是這個并不能代表所有的請求都會按照這個邏輯來執(zhí)行,往往是 Glide 還沒有請求完畢 Activity 已經(jīng)銷毀了這種情況也非常常見,為了避免這種情況,我們必須知道 Activity 什么時候銷毀,然后趕在 Activity 銷毀之前把網(wǎng)絡(luò)請求取消。

  • 這個時候 Fragment 發(fā)揮了很大的作用,我們都知道 Fragment 是依附于 Activity,同時這兩者的生命周期是綁定在一起的,Glide 通過 Fragment 的生命周期就能知道 Activity 的生命周期。

  • 那么問題又來了,剛剛 Glide.with 有很多重載方法,萬一它傳入的不是 FragmentActivity,而是其他類型的對象,那么 Glide 又會怎么處理呢?

  • 我就是不給你傳入 FragmentActivity,而是直接傳入 Activity,讓 Glide 創(chuàng)建不了 Fragment 對象,這樣它就監(jiān)聽不到 Activity 的生命周期了

  • 接下來讓我們看看 Glide 應(yīng)對 Activity 對象會做什么不一樣的處理?

  • 看到這里,我們要糾正一個誤區(qū),不是一定要 FragmentActivity 才能創(chuàng)建 Fragment,其實 Activity 對象也是可以的,只不過這個是 Android 3.0 之后的特性

  • app.Fragment、support.Fragment 的思想和用法和 Activity 和 Fragment Activity 大同小異,這里直接略過

  • 再來跟大家講講 Fragment,它又是怎么監(jiān)聽生命周期的

  • 看到這里,我們沒必須要繼續(xù)往下看了,還是原來的配方,還是熟悉的味道

  • 接下來讓我們看看 Context 參數(shù)的 Glide.with 方法

  • 分析上面的源碼,我們可以知道,你如果給 Glide 傳入的是一個 Context 對象,它會自動推導(dǎo) Context 的類型,究竟是 FragmentActivity 呢還是 Activity 呢,如果兩種都不是呢?萬一是 Application 的 Context 呢?接下來繼續(xù)看源碼
  • 看到這段源碼,我們又發(fā)現(xiàn)了一個 Lifecycle 類,只不過這次跟我們之前看到的 ActivityFragmentLifecycle 類不一樣,因為它換了一個馬甲:ApplicationLifecycle
  • 那么又問題來了,它和 ActivityFragmentLifecycle 有什么區(qū)別?
  • 讓我們再回顧一下這個類,經(jīng)過比對不難發(fā)現(xiàn),ApplicationLifecycle 類沒有生命周期之類的方法回調(diào)

  • 所以到這里,我們也不難斷定,當我們傳入的 Context 對象經(jīng)過推導(dǎo)之后不是 Activity 或者 FragmentActivity 對象,那么 Glide 會把這個請求當做一個全局請求,何為全局請求,請求的生命周期和應(yīng)用的生命周期保持一致,只要應(yīng)用不被殺死,那么這個網(wǎng)絡(luò)請求在請求完畢之前就不會消失。

總結(jié)

  • Glide 請求生命周期主要利用一個無界面的 Fragment,然后綁定到 Activity / Fragment 上面,由此來感知 Activity / Fragment 的生命周期,從而趕在 Activity / Fragment 對象銷毀之前把網(wǎng)絡(luò)請求移除掉,另外如果我們傳入的 Context 對象不是 Activity / Fragment,Glide 會默認將這個網(wǎng)絡(luò)請求作為一個全局請求,這樣就完成了 Glide 對網(wǎng)絡(luò)請求的生命周期控制。

下一篇:Glide 三部曲之圖片加載流程

Android 技術(shù)討論 Q 群:10047167

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容