- 本文章所使用的 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ò)請求的生命周期控制。