一點點入坑JetPack:Lifecycle篇

zybing發表於2021-09-09

前言

因為業務的原因,自己也開始了JetPack之旅。不得不承認,用上之後:真香。
JatPack以官方的方案,解決了很多我們頭疼的問題。JatPack作為一整套的解決方案,不是一篇文章很夠解釋清楚的。正如官方所說:

Android Jetpack 元件是庫的集合,這些庫是為協同工作而構建的,不過也可以單獨採用,同時利用 Kotlin 語言功能幫助您提高工作效率。可全部使用,也可混合搭配!

所以這將是一個系列文章,一點點的展開我在JetPack應用中的所學所想。(目前公司專案已將全面用Kotlin,JetPack進行了重構,因此很多程式碼的設計會和我們的業務相結合,所以仁者見仁智者見智啦~)

文章重點部分將聚焦:

圖片描述

image

正文

不想看我瞎比比的,也可以直接跳轉至官網: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介面:

// 官方democlass 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!!

沒錯,我們常規的Activitiy/Fragment就是調不到...它壓根就沒這這個方法。

2.2、androidx

這裡解釋一下,上文中lifecyle其實就是呼叫Activity/Fragment中的這個方法:

@Overridepublic 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還拿出了ViewModelLiveData等相輔相成的有趣模組。下邊將走進:ViewModel篇。

尾聲

許久沒有寫文章了,一來是最近地區很忙;二來自己也剛開始搞JatPack這一套。學的過程中漸漸發現JetPack屬實比較有意思。所以決定好好的把JetPack研究一翻。



作者:MDove
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-2821455/,如需轉載,請註明出處,否則將追究法律責任。

相關文章