一點(diǎn)點(diǎn)入坑JetPack:Lifecycle篇

前言

因?yàn)闃I(yè)務(wù)的原因,自己也開始了JetPack之旅累盗。不得不承認(rèn),用上之后:真香突琳。
JatPack以官方的方案若债,解決了很多我們頭疼的問題。JatPack作為一整套的解決方案拆融,不是一篇文章很夠解釋清楚的蠢琳。正如官方所說:

Android Jetpack 組件是庫的集合啊终,這些庫是為協(xié)同工作而構(gòu)建的,不過也可以單獨(dú)采用傲须,同時(shí)利用 Kotlin 語言功能幫助您提高工作效率蓝牲。可全部使用泰讽,也可混合搭配例衍!

所以這將是一個(gè)系列文章,一點(diǎn)點(diǎn)的展開我在JetPack應(yīng)用中的所學(xué)所想已卸。(目前公司項(xiàng)目已將全面用Kotlin佛玄,JetPack進(jìn)行了重構(gòu),因此很多代碼的設(shè)計(jì)會(huì)和我們的業(yè)務(wù)相結(jié)合累澡,所以仁者見仁智者見智啦~)

一點(diǎn)點(diǎn)入坑JetPack:LiveData篇

一點(diǎn)點(diǎn)入坑JetPack:ViewModel篇

一點(diǎn)點(diǎn)入坑JetPack:Lifecycle篇

文章重點(diǎn)部分將聚焦:

image

正文

不想看我瞎比比的梦抢,也可以直接跳轉(zhuǎn)至官網(wǎng):https://developer.android.google.cn/topic/libraries/architecture/lifecycle

1、如何管理生命周期

Lifecycle的出現(xiàn)幫我們解決生命周期管理的問題。這一塊對(duì)于我們?nèi)粘i_發(fā)來說的確是比較坑的一點(diǎn),生命周期處理不當(dāng)罐旗,很容易造成內(nèi)存泄漏绝淡。
為了能讓我們業(yè)務(wù)代碼能夠感知到生命周期,我們可能會(huì)寫大量的代碼。比如在讓Presenter擁有感知生命周期的能力,我們可能會(huì)這么做:

public interface IPresenter {
    void onCreate();

    void onStart();

    void onResume();

    void onPause();

    void onStop();

    void onDestroy();
}

然后實(shí)現(xiàn)接口,在Activity/Fragment的生命周期中調(diào)用這個(gè)接口绩脆,完成工作。

這種方式完全ojbk橄抹。通俗易懂靴迫,這里我不評(píng)價(jià)它的好壞,畢竟沒有任何一種解決方案是完美的楼誓。所以接下來咱們來看一看官方的Lifecycle是怎樣的一種思路玉锌。

2、Lifecycle

說破天疟羹,這里需要解決的問題是生命周期管理主守。那么終究還是逃脫不掉一些套路成分在其中。Lifecycle也是如此榄融,從官方的解釋中参淫,可見一斑:

Lifecycle is a class that holds the information about the lifecycle state of a component (like an activity or a fragment) and allows other objects to observe this state.

短短一段話,我們可以猜測到這里通過觀察者模式的思路去對(duì)外響應(yīng)生命周期變化愧杯。閑話少說涎才,直接從代碼感受一下。

2.1力九、使用

從使用上來說耍铜,還是比較簡單的邑闺。實(shí)現(xiàn)LifecycleObserver接口:

// 官方demo
class MyObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        // TODO
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun disconnectListener() {
        // TODO
    }
}

這倆個(gè)注解則標(biāo)志著,當(dāng)監(jiān)聽組件的onResume()方法被調(diào)用棕兼,這里我們被注解的方法也會(huì)被調(diào)用陡舅。(當(dāng)然前提是addObserver了)

有了觀察者了,那我們就去找被觀察者伴挚。很明顯蹭沛,我們想要觀察的對(duì)象是擁有生命周期的家伙,比如我們常用的Activity/Fragment章鲤。此時(shí)我們只需要在onResume()之前的某個(gè)實(shí)際,把這個(gè)Observer咆贬,add進(jìn)去即可败徊,比如在onCreate()中:

override fun onCreate(savedInstanceState: Bundle?) {
   lifecycle.addObserver(MyObserver())
}

OK,這樣之后我們的MyObserver既可以正常在響應(yīng)對(duì)應(yīng)生命周期注解下的方法了掏缎。

不過皱蹦,我相信這樣寫的朋友,回過來噴我眷蜈!根本就調(diào)不到lifecycle;Σ浮!

沒錯(cuò)酌儒,我們常規(guī)的Activitiy/Fragment就是調(diào)不到...它壓根就沒這這個(gè)方法辜妓。

2.2、androidx

這里解釋一下忌怎,上文中l(wèi)ifecyle其實(shí)就是調(diào)用Activity/Fragment中的這個(gè)方法:

@Override
public Lifecycle getLifecycle() {
    return mLifecycleRegistry;
}

有朋友應(yīng)該提著刀過來了籍滴,我tm沒有這個(gè)方法!兄die榴啸,把刀放下孽惰,不是沒有是import不一樣。接下來讓我們慢慢來鸥印。我使用的這個(gè)Fragment的package是這樣的:androidx.fragment.app;勋功。看到端倪了吧库说?androidx狂鞋,沒錯(cuò),這是為了完美支持JatPack所重新規(guī)劃出來的包璃弄。

當(dāng)然要销,也不一定非要用androidx。

Fragments and Activities in Support Library 26.1.0 and later already implement the LifecycleOwner interface.

所以夏块,升庫就ok了疏咐。這時(shí)有小伙伴可能會(huì)說了:我不想升庫怎么辦纤掸。這個(gè)問題問得好,不想升庫浑塞,不想升庫..就不升唄借跪。

當(dāng)然我相信,一定有小伙伴注意到一個(gè)問題酌壕,那就是getLifecycle()是一個(gè)接口掏愁,那么也就是說我們可以自己實(shí)現(xiàn)?沒錯(cuò)是這樣...(這tm不廢話么)

這就是我們自定義的關(guān)鍵卵牍。

2.3果港、LifecycleOwner

假設(shè)我們的Activity不支持getLifecycle()咋整?這里直接上官方的代碼:

class MyActivity : Activity(), LifecycleOwner {

    private lateinit var mLifecycleRegistry: LifecycleRegistry

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mLifecycleRegistry = LifecycleRegistry(this)
        mLifecycleRegistry.markState(Lifecycle.State.CREATED)
        
        mLifecycleRegistry.addObserver(MyObserver())
    }

    public override fun onStart() {
        super.onStart()
        mLifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    override fun getLifecycle(): Lifecycle {
        return mLifecycleRegistry
    }
}

就這樣糊昙,結(jié)束了辛掠。說實(shí)話,到這就這的沒有什么好講的了释牺。

通過代碼萝衩,我們可以看出來,LifecycleRegistry是我們的被觀察者没咙,它被初始化在擁有生命周期的Activity中猩谊,而我們的Observer也被add()到其中,此外還有諸如markState(Lifecycle.State.CREATED)的方法調(diào)用祭刚。

因此牌捷,到這無需多言,各位小伙伴恐怕已經(jīng)明白了Lifecycle是如何幫我們管理生命周期的了涡驮。

2.4宜鸯、小總結(jié)

這幾段代碼下來,我相信有的朋友已經(jīng)差不多了解Lifecycle的思路了遮怜。一個(gè)很標(biāo)準(zhǔn)的觀察者模式:這里的LifecycleRegistry(系統(tǒng)幫我們實(shí)現(xiàn)的Lifecycle的實(shí)現(xiàn)類)淋袖,持有想要監(jiān)聽這個(gè)LifecycleOwner的Observer。然后通過markState()锯梁,去遍歷所有Observer即碗,通知其生命周期發(fā)生變化。

僅憑這些陌凳,對(duì)于我們來說還遠(yuǎn)遠(yuǎn)不夠剥懒,因此Google還拿出了ViewModelLiveData等相輔相成的有趣模塊合敦。下邊將走進(jìn):ViewModel篇初橘。

尾聲

許久沒有寫文章了,一來是最近地區(qū)很忙;二來自己也剛開始搞JatPack這一套保檐。學(xué)的過程中漸漸發(fā)現(xiàn)JetPack屬實(shí)比較有意思耕蝉。所以決定好好的把JetPack研究一翻。

這篇文章就算是自己回歸寫文章的先導(dǎo)篇吧~

我是一個(gè)應(yīng)屆生夜只,最近和朋友們維護(hù)了一個(gè)公眾號(hào)垒在,內(nèi)容是我們?cè)趶膽?yīng)屆生過渡到開發(fā)這一路所踩過的坑,以及我們一步步學(xué)習(xí)的記錄扔亥,如果感興趣的朋友可以關(guān)注一下场躯,一同加油~

個(gè)人公眾號(hào):咸魚正翻身
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旅挤,隨后出現(xiàn)的幾起案子踢关,更是在濱河造成了極大的恐慌,老刑警劉巖粘茄,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耘成,死亡現(xiàn)場離奇詭異,居然都是意外死亡驹闰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門撒会,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘹朗,“玉大人,你說我怎么就攤上這事诵肛∫倥啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵怔檩,是天一觀的道長褪秀。 經(jīng)常有香客問我,道長薛训,這世上最難降的妖魔是什么媒吗? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮乙埃,結(jié)果婚禮上闸英,老公的妹妹穿的比我還像新娘。我一直安慰自己介袜,他們只是感情好甫何,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遇伞,像睡著了一般辙喂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天巍耗,我揣著相機(jī)與錄音秋麸,去河邊找鬼。 笑死芍锦,一個(gè)胖子當(dāng)著我的面吹牛竹勉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娄琉,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼次乓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孽水?” 一聲冷哼從身側(cè)響起票腰,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎女气,沒想到半個(gè)月后杏慰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炼鞠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年缘滥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒主。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朝扼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霎肯,到底是詐尸還是另有隱情擎颖,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布观游,位于F島的核電站搂捧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懂缕。R本人自食惡果不足惜允跑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搪柑。 院中可真熱鬧吮蛹,春花似錦、人聲如沸拌屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倚喂。三九已至每篷,卻和暖如春瓣戚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焦读。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工子库, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矗晃。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓仑嗅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親张症。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仓技,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容