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

在真正接觸並使用MVVM架構的時候,整我的都很差了。由於我的以爲,MVVM相對於MVC、MVP學習難度比較大,設計的知識點不是一點半點。因此想慢慢記錄下本身的成長。若有錯誤但願指正。java


從零開始搭建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框架(終極篇)git


仍是那張圖AAC(Android Architecture Components)github

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


1、Lifecycles介紹和簡單認識

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

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

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

@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的組件,內部已是幫咱們處理好的)this


2、本身實現LifecycleOwner(被觀察者的生命週期)

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

Activity以下:google

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的效果同樣:離開界面的時候不會打印,當返回界面的時候當即打印。


3、本身實現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地址

相關文章
相關標籤/搜索