LiveData一般是和 ViewModel 配合使用的,但是本文就以单独使用 LiveData 作为例子单独使用,这样可以只关注 LiveData 而不被其他所干扰。
本文整体流程:首先要知道什么是 LiveData,然后演示一个例子,来看看 LiveData 是怎么使用的,接着提出问题为什么是这样的,最后读源码来解释原因!
LiveData 的源码比较简单,底层依赖了 Lifecycle,所以懂 Lifecycle 的源码是关键,我之前写过一篇
Android Jetpack组件Lifecycle基本使用和原理分析 最好是先看这篇文章,才能更好的理解 LiveData。
1.什么是 LiveData
LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
2.LiveData基础使用的例子
这个例子,是点击按钮通过 LiveData 来更新 TextView 的内容
如图:
点击按钮后
具体代码
class LiveDataActivity : BaseActivity() {
private val mContent = MutableLiveData<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_live_data)
btnUpdate.setOnClickListener {
mContent.value = "最新值是:Update"
}
mContent.observe(this, Observer {
content ->
tvContent.text = content
})
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvContent"
android:layout_width="0dp"
android:text="Hello World"
android:layout_height="wrap_content"
android:textColor="#f00"
android:gravity="center"
android:textSize="24sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btnUpdate"
android:layout_width="wrap_content"
android:text="Update"
android:padding="5dp"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp"
android:layout_marginTop="20dp"
android:textAllCaps="false"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvContent" />
</androidx.constraintlayout.widget.ConstraintLayout>
默认TextView展示的是: Hello World,点击按钮后展示的是:“最新值是:Update” 。这个就是LiveData 的简单使用。
3.抛出问题
为什么LiveData的工作机制是这样的
- LiveData 是怎么回调的?
- LiveData 为什么可以感知生命周期?
- LiveData 可以感知生命周期,有什么用,或者说有什么优势?
- LiveData 为什么只会将更新通知给活跃的观察者。非活跃观察者不会收到更改通知?
- LiveData此外还提供了observerForever()方法,所有生命周期事件都能通知到,怎么做到的?
解析来通过分析源码,来寻找答案。文章最后我会解释这些问题的,做一个统一的总结。
4.源码分析前的准备工作
我需要了解几个类,来对接下来的源码分析做一个铺垫。
先看之前例子中的代码
class LiveDataActivity : BaseActivity() {
private val mContent = MutableLiveData<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mContent.observe(this, Observer {
content ->
tvContent.text = content
})
}
}
只贴出了主要代码,我们来看下主要的类以及方法,方法参数
- 声明了一个MutableLiveData对象
- 调用了MutableLiveData的observe方法
- observe方法中 传入 this 和 Observer
- this 指的是LiveDataActivity对象,其实一个是一个LifecycleOwner。Observer是一个接口
来分别看下具体内容。
4.1.MutableLiveData类
public class MutableLiveData<T> extends LiveData<T> {
public MutableLiveData(T value) {
super(value);
}
public MutableLiveData(