LifeCycle速成

其他相关文章:

android之ViewModel:https://blog.csdn.net/li6472/article/details/119800423?spm=1001.2014.3001.5501

android之LiveData:https://blog.csdn.net/li6472/article/details/119784791?spm=1001.2014.3001.5501

android之MVVM框架使用之xml详解:https://blog.csdn.net/li6472/article/details/119782825?spm=1001.2014.3001.5501

android之MVVM框架使用之BaseObservable与双向绑定MVVM框架使用之BaseObservable与双向绑定:https://blog.csdn.net/li6472/article/details/119782825?spm=1001.2014.3001.5501

android之MVVM理解:https://blog.csdn.net/li6472/article/details/119762190?spm=1001.2014.3001.5501

amdroid之MVVM写一个简单的程序:https://blog.csdn.net/li6472/article/details/119761806?spm=1001.2014.3001.5501

学习一个新知识之前应该知道他的作用和应用场合是什么:

Lifecycle类持有Activity 或 Fragment等组件的生命周期信息,并且允许其他对象观察这些信息。
Lifecycle内部使用了两个枚举来跟踪其关联组件的生命周期状态:Event和State。祥见下面分析。

可以通过调用Lifecycle类的 addObserver() 方法来添加观察者,如下:

        getLifecycle().addObserver(new TestLifeCycle());5

一 导包

1 首先在build.gradle中添加如下行

 2 官网文档地址

https://developer.android.com/topic/libraries/architecture/lifecycle

3 接口

Lifecycle
Lifecycle是一个持有组件生命周期状态(如Activity或Fragment)的信息的类,并允许其他对象观察此状态。

Event :从框架和Lifecycle类派发的生命周期事件。这些事件映射到活动和片段中的回调事件。

State :由Lifecycle对象跟踪的组件的当前状态。

LifecycleOwner (重要)Lifecycle持有者

实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。

LifecycleObserver(重要)Lifecycle观察者

实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。

4 关系图

Lifecycle组件成员Lifecycle被定义成了抽象类,LifecycleOwner、LifecycleObserver被定义成了接口;

Fragment实现了LifecycleOwner接口,该只有一个返回Lifecycle对象的方法getLifecyle();

Fragment中getLifecycle()方法返回的是继承了抽象类Lifecycle的LifecycleRegistry。

LifecycleRegistry中定义嵌套类ObserverWithState,该类持有GenericLifecycleObserver对象,而GenericLifecycleObserver是继承了LifecycleObserver的接口。

二 LifeCycle中两个重要的接口LifeCycleOwner和LifecycleObserver 的使用

(1)LifecycleOwner(生命周期持有者接口)

LifecycleOwner就是一个接口,谁继承了它,就持有了lifecycle对象。然后就可以调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,然后调用 addObserver(@NonNull LifecycleObserver observer) 方法来注册监听。
这样,该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。

注意:Support Library 26.1.0 及其以后的版本,Activity 和Fragment 已经实现了LifecycleOwner 接口,所以,我们可以直接在Activity 和Fragment中使用getLifecycle()方法来获取lifecycle对象,来添加观察者监听。
(2)LifecycleObserver(生命周期观察者接口)

实现DefultLifecyceObserver接口,然后重写里面生命周期方法;

我们在Fragment(AppCompatActivity也一样)中调用getLifecycle()方法得到LifecycleRegistry对象,然后调用addObserver()方法并将实现了LifecycleObserver接口的对象作为参数传进去。这样一个过程就完成了注册监听的过程,运行查看log.

 

 后续就是Fragment生命周期变化时,通知LifecycleObserver的过程:Fragment的performXXX()、onXXX()方法;LifecycleRegistry的handleLifecycleEvent()方法;LifecycleObserver的onXXX()方法。(具体如下)
Fragment中performCreate()、performStart()、performResume()会先调用自身的onXXX()方法,然后再调用LifecycleRegistry的handleLifecycleEvent()方法;而在performPause()、performStop()、performDestroy()中会先LifecycleRegistry的handleLifecycleEvent()方法 ,然后调用自身的onXXX()方法

四 注意

(可以保存慢慢理解,进阶内容)

生命周期状态为RESUMED时表示,当前activity 是在前台,并且可交互也就是onResume()执行后

生命周期状态为STARTED时,表示当前activity处于可见但是不可交互,也就是onStart()方法刚执行完或者onPause()方法刚执行完的状态

生命周期状态为CREATED,表示onCreate()方法刚刚执行完或者onStop()方法刚刚执行完,也就是当前activity不在前台,但是也没有处于销毁状态。

生命周期状态为DESTORYED,表示当前Activity还不存在,没有被创建或者已经销毁,我们通常考虑比较多的就是,onDestory()方法执行后,当前Activity已经销毁。

所以,如果我们要保证在Activity或者Fragment的有效生命周期内进行的操作,必须判断,当前lifecycle的状态是否至少是CREATED状态,避免Activity或者fragment销毁了以后,回调或者网络请求才回来,此时做一些操作会导致异常。

把lifecycle对象传给观察者,让它自己去判断回调后的代码,保证至少是CREATED状态

   private Lifecycle lifecycle;
   public MyObserver(Lifecycle lifecycle) {
        this.lifecycle = lifecycle;
    }
//然后再相应的回调方法中使用下面代码判断,保证数据回调回来,当前activity是存在的
    if (lifecycle.getCurrentState().isAtLeast(CREATED)) {
            //这里只是示例,不一定是CREATED
    }


Lifecycle的源码(可做状态参考)

public class AndroidViewModel extends ViewModel {
    @SuppressLint("StaticFieldLeak")
    private Application mApplication;

    public AndroidViewModel(@NonNull Application application) {
        mApplication = application;
    }

    /**
     * Return the application.
     */
    @SuppressWarnings("TypeParameterUnusedInFormals")
    @NonNull
    public <T extends Application> T getApplication() {
        //noinspection unchecked
        return (T) mApplication;
    }
}

尽可能保持您的UI控制器(活动和片段)尽可能精简。他们不应该试图获取他们自己的数据;相反,使用ViewModel来做到这一点,并观察一个LiveData对象来反映更改回视图。
尝试编写数据驱动的用户界面,其中您的用户界面控制器的职责是在数据更改时更新视图,或将用户操作通知给ViewModel。
把你的数据逻辑放在ViewModel类中。ViewModel应作为您的UI控制器和其他应用程序之间的连接器。但要小心,ViewModel不负责提取数据(例如,来自网络)。相反,ViewModel应调用相应的组件来获取数据,然后将结果提供给UI控制器。
使用dataBinding在视图和UI控制器之间保持干净的界面。这使您可以使您的视图更具说明性,并最大限度地减少需要在活动和片段中编写的更新代码。
如果你喜欢用Java编程语言来做到这一点,可以使用像Butter Knife这样的库来避免样板代码并且有更好的抽象。
如果您的UI很复杂,请考虑创建一个演示者类(presenter)来处理UI修改。这可能是一项艰巨的任务,但它可以使您的UI组件更易于测试。
避免在ViewModel中引用View或Activity上下文。
如果ViewModel超出活动(在配置更改的情况下),则活动会泄漏并且垃圾收集器无法正确处理。

由于技术尚浅,欢迎大家一起探讨

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值