其他相关文章:
android之ViewModel:https://blog.youkuaiyun.com/li6472/article/details/119800423?spm=1001.2014.3001.5501
android之LiveData:https://blog.youkuaiyun.com/li6472/article/details/119784791?spm=1001.2014.3001.5501
android之MVVM框架使用之xml详解:https://blog.youkuaiyun.com/li6472/article/details/119782825?spm=1001.2014.3001.5501
android之MVVM框架使用之BaseObservable与双向绑定MVVM框架使用之BaseObservable与双向绑定:https://blog.youkuaiyun.com/li6472/article/details/119782825?spm=1001.2014.3001.5501
android之MVVM理解:https://blog.youkuaiyun.com/li6472/article/details/119762190?spm=1001.2014.3001.5501
amdroid之MVVM写一个简单的程序:https://blog.youkuaiyun.com/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超出活动(在配置更改的情况下),则活动会泄漏并且垃圾收集器无法正确处理。
由于技术尚浅,欢迎大家一起探讨