Android从零开始搭建MVVM架构(5)————Lifecycles

6,652 阅读4分钟

在真正接触并使用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地址