前言
因為業務的原因,自己也開始了JetPack之旅。不得不承認,用上之后:真香。
JatPack以官方的方案,解決了很多我們頭疼的問題。JatPack作為一整套的解決方案,不是一篇文章很夠解釋清楚的。正如官方所說:
Android Jetpack 組件是庫的集合,這些庫是為協同工作而構建的,不過也可以單獨采用,同時利用 Kotlin 語言功能幫助您提高工作效率??扇渴褂茫部苫旌洗钆?!
所以這將是一個系列文章,一點點的展開我在JetPack應用中的所學所想。(目前公司項目已將全面用Kotlin,JetPack進行了重構,因此很多代碼的設計會和我們的業務相結合,所以仁者見仁智者見智啦~)
文章重點部分將聚焦:
正文
不想看我瞎比比的,也可以直接跳轉至官網:https://developer.android.google.cn/topic/libraries/architecture/lifecycle
1、如何管理生命周期
Lifecycle的出現幫我們解決生命周期管理的問題。這一塊對于我們日常開發來說的確是比較坑的一點,生命周期處理不當,很容易造成內存泄漏。
為了能讓我們業務代碼能夠感知到生命周期,我們可能會寫大量的代碼。比如在讓Presenter擁有感知生命周期的能力,我們可能會這么做:
public interface IPresenter {
void onCreate();
void onStart();
void onResume();
void onPause();
void onStop();
void onDestroy();
}
然后實現接口,在Activity/Fragment的生命周期中調用這個接口,完成工作。
這種方式完全ojbk。通俗易懂,這里我不評價它的好壞,畢竟沒有任何一種解決方案是完美的。所以接下來咱們來看一看官方的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.
短短一段話,我們可以猜測到這里通過觀察者模式的思路去對外響應生命周期變化。閑話少說,直接從代碼感受一下。
2.1、使用
從使用上來說,還是比較簡單的。實現LifecycleObserver接口:
// 官方demo
class MyObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun connectListener() {
// TODO
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun disconnectListener() {
// TODO
}
}
這倆個注解則標志著,當監聽組件的onResume()方法被調用,這里我們被注解的方法也會被調用。(當然前提是addObserver了)
有了觀察者了,那我們就去找被觀察者。很明顯,我們想要觀察的對象是擁有生命周期的家伙,比如我們常用的Activity/Fragment。此時我們只需要在onResume()之前的某個實際,把這個Observer,add進去即可,比如在onCreate()中:
override fun onCreate(savedInstanceState: Bundle?) {
lifecycle.addObserver(MyObserver())
}
OK,這樣之后我們的MyObserver既可以正常在響應對應生命周期注解下的方法了。
不過,我相信這樣寫的朋友,回過來噴我!根本就調不到lifecycle?。?/strong>
沒錯,我們常規的Activitiy/Fragment就是調不到...它壓根就沒這這個方法。
2.2、androidx
這里解釋一下,上文中lifecyle其實就是調用Activity/Fragment中的這個方法:
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
有朋友應該提著刀過來了,我tm沒有這個方法!兄die,把刀放下,不是沒有是import不一樣。接下來讓我們慢慢來。我使用的這個Fragment的package是這樣的:androidx.fragment.app;
??吹蕉四吡税??androidx,沒錯,這是為了完美支持JatPack所重新規劃出來的包。
當然,也不一定非要用androidx。
Fragments and Activities in Support Library 26.1.0 and later already implement the LifecycleOwner interface.
所以,升庫就ok了。這時有小伙伴可能會說了:我不想升庫怎么辦。這個問題問得好,不想升庫,不想升庫..就不升唄。
當然我相信,一定有小伙伴注意到一個問題,那就是getLifecycle()
是一個接口,那么也就是說我們可以自己實現?沒錯是這樣...(這tm不廢話么)
這就是我們自定義的關鍵。
2.3、LifecycleOwner
假設我們的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
}
}
就這樣,結束了。說實話,到這就這的沒有什么好講的了。
通過代碼,我們可以看出來,LifecycleRegistry
是我們的被觀察者,它被初始化在擁有生命周期的Activity中,而我們的Observer
也被add()到其中,此外還有諸如markState(Lifecycle.State.CREATED)
的方法調用。
因此,到這無需多言,各位小伙伴恐怕已經明白了Lifecycle是如何幫我們管理生命周期的了。
2.4、小總結
這幾段代碼下來,我相信有的朋友已經差不多了解Lifecycle的思路了。一個很標準的觀察者模式:這里的LifecycleRegistry(系統幫我們實現的Lifecycle的實現類),持有想要監聽這個LifecycleOwner的Observer。然后通過markState(),去遍歷所有Observer,通知其生命周期發生變化。
僅憑這些,對于我們來說還遠遠不夠,因此Google還拿出了ViewModel
、LiveData
等相輔相成的有趣模塊。下邊將走進:ViewModel篇。
尾聲
許久沒有寫文章了,一來是最近地區很忙;二來自己也剛開始搞JatPack這一套。學的過程中漸漸發現JetPack屬實比較有意思。所以決定好好的把JetPack研究一翻。
這篇文章就算是自己回歸寫文章的先導篇吧~