前言
因?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)部分將聚焦:
正文
不想看我瞎比比的梦抢,也可以直接跳轉(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還拿出了ViewModel
、LiveData
等相輔相成的有趣模塊合敦。下邊將走進(jìn):ViewModel篇初橘。
尾聲
許久沒有寫文章了,一來是最近地區(qū)很忙;二來自己也剛開始搞JatPack這一套保檐。學(xué)的過程中漸漸發(fā)現(xiàn)JetPack屬實(shí)比較有意思耕蝉。所以決定好好的把JetPack研究一翻。
這篇文章就算是自己回歸寫文章的先導(dǎo)篇吧~