【AAC 系列二】深入理解架构组件的基石:Lifecycle
在之前我们深入研究了 Lifecycle 的实现原理,并在文末提到了LiveData 以及 ViewModel,这次我们来讲讲 LiveData。
LiveData 是 Android Architecture Components 中的一员,先看下官方是如何介绍的:
LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services. This awareness ensures LiveData only updates app component observers that are in an active lifecycle state. [见 9.1]
This class is designed to hold individual data fields of ViewModel, but can also be used for sharing data between different modules in your application in a decoupled fashion. [见 9.2]
简单讲 LiveData 是一个能够感知生命周期、可观察的数据持有类
,它被设计成 ViewModel 的一个成员变量;可以以一个 更解耦
的方式来共享数据。
实际使用下来发现 LiveData 有几个特性:
- LiveData 的实现基于观察者模式;
- LiveData 跟 LifecycleOwner 绑定,能感知生命周期变化,并且只会在 LifecycleOwner 处于
Active
状态(STARTED/RESUMED)下通知数据改变; - LiveData 会自动在 DESTROYED 的状态下移除 Observer ,取消订阅,所以不用担心内存泄露;
那么 LiveData 上述特性的原理是怎么样的呢?
使用 LiveData 又需要注意些什么呢?
本文将围绕此展开。
1. LiveData 的基本使用
虽然 LiveData 通常跟 ViewModel 配合使用,不过也可以单独使用,为了简单起见,这里不配合 ViewModel。
以下是一个简单的例子:
MutableLiveData liveString = new MutableLiveData<>();
liveString.observe(this, new Observer() {
@Override
public void onChanged(@Nullable final String s) {
Log.d(TAG, “onChanged() called with: s = [” + s + “]”);
}
});
liveString.postValue(“程序亦非猿”);
运行后可以看到日志输出:onChanged() called with: s = [程序亦非猿]
。
释义:
定义一个 MutableLiveData (LiveData 的一个常用子类),通过 observe 方法可以订阅修改数据的通知,通过 postValue()
或者 setValue()
方法可以更新数据,已经订阅的 Observer 能够得到数据更改的通知,也即回调 onChanged()
方法。
这样就算是用上 LiveData 了。
接下来,上干货!
2. LiveData 的原理分析
在分析原理前,再明确一下我们的疑问:
- LiveData 是如何跟 LifecycleOwner 进行绑定,做到感知生命周期的?
- LiveData 只在 LifecycleOwner active 状态发送通知,是怎么处理的?
- LiveData 会自动在 DESTROY 的状态下取消订阅,是怎么处理的?
- 通过 setValue()/postValue() 更新数据的处理流程是如何?
- 生命周期变化后数据处理流程是怎么样的?
同时提