Android從零開始搭建MVVM架構(5)————Lifecycles

在真正接觸並使用MVVM架構的時候,整個人都不好了。因爲個人覺得,MVVM相對於MVC、MVP學習難度比較大,設計的知識點不是一點半點。所以想慢慢記錄下自己的成長。如有錯誤希望指正。

從零開始搭建MVVM架構系列文章(持續更新):
Android從零開始搭建MVVM架構(1)————DataBinding
Android從零開始搭建MVVM架構(2)————ViewModel
Android從零開始搭建MVVM架構(3)————LiveData
Android從零開始搭建MVVM架構(4)————Room(從入門到進階)
Android從零開始搭建MVVM架構(5)————Lifecycles
Android從零開始搭建MVVM架構(6)————使用玩Android API帶你搭建MVVM框架(初級篇)
Android從零開始搭建MVVM架構(7) ———— 使用玩Android API帶你搭建MVVM框架(終極篇)

還是那張圖AAC(Android Architecture Components)

這篇我們講Lifecycles,讓我們瞭解和認識Lifecycles後,最終運用到我們的MVVM的項目中去。本文是自己的總結,如有錯誤,請指正


一、Lifecycles介紹和簡單認識

介紹:能感知生命週期的組件
作用:監測Activity/Fragment等生命週期組件在生命週期變化時,能及時通知其他組件

其中包括了LifecycleOwner、LifecycleObserver。我們可以這麼理解,實現了LifecycleOwner就是被觀察者,我們可以看源碼(Returns the Lifecycle of the provider,生命週期的提供方,那麼久可以認爲是被觀察),而LifecycleObserver可以是觀察者。

想想,如果我們沒有LiveData組件,但是還要實現:Activity的生命週期處於onStart與onResume時,LiveData處於活動狀態,纔會把更新的數據通知至對應的Activity
,如果生命週期處於onStop或者onPause時,不回調數據更新,直至生命週期爲onResume時,立即回調。沒有LiveData我們就要在代碼裏和Activity裏寫一堆判斷去實現這個功能,而現在Lifecycles已經幫我們實現了這個功能了,我們只管用。來看看我們之前說的LiveData,LiveData監聽改變的代碼:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //this這裏的類型就是LifecycleOwner,
        liveData.observe(this, new Observer<String>() {
            //這裏就就是一旦被觀察者LifecycleOwner的生命週期改變,就會通知觀察者liveData調用onChanged。
            @Override
            public void onChanged(String s) {
                
            }
        });
    }

爲什麼這裏能直接用this呢? 之前也解釋過了,在26版本以後的Support庫中,AppCompatActivity和SupportActivity中都實現了LifecycleOwner,內部已經對UI界面的生命週期做了處理了。我們可以直接代碼點進去,如下

這裏如果還不清晰的話,我們來自己實現LifecycleOwner、LifecycleObserver(要知道google的組件,內部已經是幫我們處理好的)


二、自己實現LifecycleOwner(被觀察者的生命週期)

  • 我們創建一個Actvity,繼承Activity類,注意是沒有實現LifecycleOwner的。
  • 自己實現LifecycleOwner,並提供被觀察者的生命週期
  • new 一個LiveData,並實現LiveData數據改變監聽。
  • 在onstop的時候,給LiveData post個數據

Activity如下:

public class LifecyclesActivity extends Activity implements LifecycleOwner {
    private MutableLiveData<String> liveData = new MutableLiveData<>();
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lifecycles);
        liveData.observe(this, new Observer<String>() {
            @Override
            public void onChanged(String s) {
                LogUtils.i("觀察LiveData", " ==> " + s);
            }
        });

    }

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        super.onSaveInstanceState(outState);
    }

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

    @Override
    protected void onStop() {
        super.onStop();
        liveData.postValue("運行試試");
    }
}

運行後看打印,按home鍵退出去,然後點擊回來。同樣出現了我們之前LiveData的效果一樣:離開界面的時候不會打印,當返回界面的時候立即打印。


三、自己實現LifecycleObserver(觀察者)

我們自己新建一個MyObserver,監聽所有生命週期

public class MyObserver implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        LogUtils.i("MyObserver","onCreate");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        LogUtils.i("MyObserver","onStart");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        LogUtils.i("MyObserver","onResume");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        LogUtils.i("MyObserver","onPause");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        LogUtils.i("MyObserver","onStop");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestory() {
        LogUtils.i("MyObserver","onDestory");
    }

//    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
//    public void onAny() {
//        LogUtils.i("MyObserver","onAny");
//    }
}

然後Activtiy裏,加上

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lifecycles);
        getLifecycle().addObserver(new MyObserver());

    }

運行後,看打印,這裏我就不貼效果了。當我們在項目裏用到Lifecycles時,以上這些都不用我們考慮。我這裏只是簡單告訴大家,lifecycles到底是怎麼個意思。google已經把我們要處理的都封裝在這些組件裏。

至此這裏我們對lifecycles有了大概瞭解了。加油

本文demo地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章