Lifecycle、LiveData、ViewModel介绍
在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。
- Lifecycle
(Lifecycle)生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。
androidx.lifecycle 软件包提供了可用于构建生命周期感知型组件的类和接口 - 这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。
- Lifecycle产生的原因
在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。
此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。
androidx.lifecycle 软件包提供的类和接口可帮助您以弹性和隔离的方式解决这些问题。
1.Lifecycle
1.1Lifecycle关键类说明
- Lifecycle
定义一个有Android生命周期的对象,是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。
使用两种主要枚举跟踪其关联组件的生命周期状态:
事件:从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件。
public enum Event {
//生命周期方法
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
//注解以后所有生命周期方法都会回调
ON_ANY
}
状态:由 Lifecycle 对象跟踪的组件的当前状态。
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
构成 Android Activity 生命周期的状态和事件如图:
您可以将状态看作图中的节点,将事件看作这些节点之间的边。
- LifecycleOwner
LifecycleOwner 是单一方法接口,表示类持有 Lifecycle。它具有一种方法(即 getLifecycle()),该方法必须由类实现。
此接口从各个类(如 Fragment 和 AppCompatActivity)抽象化 Lifecycle 的所有权,并允许编写与这些类搭配使用的组件。任何自定义应用类均可实现 LifecycleOwner 接口。
- LifecycleObserver
标记一个类作为LifecycleObserver,生命周期观察者回调,LifecycleObserver没有任何方法,依赖OnLifecycleEvent注解方法标示监听生命周期方法;
- LifecycleRegistry
实现Lifecycle接口,可以同时通知多个LifecycleObserver观察者对象;
注意:实现 LifecycleObserver 的组件可与实现 LifecycleOwner 的组件无缝协同工作,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。
1.2Lifecycle使用示例(Activity继承AppCompatActivity)
1.2.1引入依赖
在 根目录 的build.gradle
文件中,加上google()
的远程仓库声明(现在AS
创建的工程已经默认包含了该声明)。
allprojects {
repositories {
jcenter()
//加上这一句。
google()
}
}
添加Lifecycle依赖有如下两种方式
implementation 'com.android.support:appcompat-v7:28.0.0'
或者
- 选择仅导入
LiveData
、ViewModel
、Lifecycles
的其中一种,或者全部导入。 - 注解处理器,在
Java8
上使用common-java8
,在Java8
以下使用compiler
。 - 流式处理支持库
reactivestreams
- 测试支持库
core-testing
def lifecycle_version = "1.1.1"
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// alternatively - just ViewModel
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version"