Glide 三部曲之請(qǐng)求生命周期管控

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

源碼解析

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

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

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

  • 帶著這個(gè)疑問窃款,我們先進(jìn)入 Glide.with(FragmentActivity activity) 的源碼里面看看

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

  • 這個(gè)問題非常值得我們?nèi)ニ伎迹紫任覀円姥绺В珿lide 是通過網(wǎng)絡(luò)請(qǐng)求獲取圖片的資源勒魔,網(wǎng)絡(luò)請(qǐng)求是異步的,也就是必須在子線程中菇曲,而 Activity 是運(yùn)行在主線程中冠绢,正常的情況是 Glide 請(qǐng)求完畢之后 Activity 再銷毀,但是這個(gè)并不能代表所有的請(qǐng)求都會(huì)按照這個(gè)邏輯來執(zhí)行常潮,往往是 Glide 還沒有請(qǐng)求完畢 Activity 已經(jīng)銷毀了這種情況也非常常見弟胀,為了避免這種情況,我們必須知道 Activity 什么時(shí)候銷毀蕊玷,然后趕在 Activity 銷毀之前把網(wǎng)絡(luò)請(qǐng)求取消邮利。

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

  • 那么問題又來了贸诚,剛剛 Glide.with 有很多重載方法方庭,萬一它傳入的不是 FragmentActivity,而是其他類型的對(duì)象酱固,那么 Glide 又會(huì)怎么處理呢械念?

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

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

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

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

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

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

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

  • 分析上面的源碼羞延,我們可以知道渣淳,你如果給 Glide 傳入的是一個(gè) Context 對(duì)象,它會(huì)自動(dòng)推導(dǎo) Context 的類型伴箩,究竟是 FragmentActivity 呢還是 Activity 呢水由,如果兩種都不是呢?萬一是 Application 的 Context 呢赛蔫?接下來繼續(xù)看源碼
  • 看到這段源碼,我們又發(fā)現(xiàn)了一個(gè) Lifecycle 類泥张,只不過這次跟我們之前看到的 ActivityFragmentLifecycle 類不一樣呵恢,因?yàn)樗鼡Q了一個(gè)馬甲:ApplicationLifecycle
  • 那么又問題來了,它和 ActivityFragmentLifecycle 有什么區(qū)別媚创?
  • 讓我們?cè)倩仡櫼幌逻@個(gè)類渗钉,經(jīng)過比對(duì)不難發(fā)現(xiàn),ApplicationLifecycle 類沒有生命周期之類的方法回調(diào)

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

總結(jié)

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲜屏,一起剝皮案震驚了整個(gè)濱河市烹看,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墙歪,老刑警劉巖听系,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虹菲,居然都是意外死亡靠胜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浪漠,“玉大人陕习,你說我怎么就攤上這事≈吩福” “怎么了该镣?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵县踢,是天一觀的道長沙绝。 經(jīng)常有香客問我,道長亲茅,這世上最難降的妖魔是什么娘纷? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任嫁审,我火速辦了婚禮,結(jié)果婚禮上赖晶,老公的妹妹穿的比我還像新娘律适。我一直安慰自己,他們只是感情好遏插,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布捂贿。 她就那樣靜靜地躺著,像睡著了一般胳嘲。 火紅的嫁衣襯著肌膚如雪厂僧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天胎围,我揣著相機(jī)與錄音吁系,去河邊找鬼。 笑死白魂,一個(gè)胖子當(dāng)著我的面吹牛汽纤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播福荸,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蕴坪,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了敬锐?” 一聲冷哼從身側(cè)響起背传,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎台夺,沒想到半個(gè)月后径玖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颤介,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年梳星,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赞赖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冤灾,死狀恐怖前域,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情韵吨,我是刑警寧澤匿垄,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站归粉,受9級(jí)特大地震影響椿疗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糠悼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一变丧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绢掰,春花似錦、人聲如沸童擎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顾复。三九已至班挖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芯砸,已是汗流浹背萧芙。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留假丧,地道東北人双揪。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像包帚,于是被迫代替她去往敵國和親渔期。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348