1. 概念理解
简介:LiveData 是一个有生命周期感知 + 可观察的数据持有者类
作用:持久化的观察数据的更改与变化
特点
- 感知对应Activity的生命周期,只有生命周期处于onStart与onResume时,LiveData处于活动状态,才会把更新的数据通知至对应的Activity
- 当生命周期处于onStop或者onPause时,不回调数据更新,直至生命周期为onResume时,立即回调
- 当生命周期处于onDestory时,观察者会自动删除,防止内存溢出
- 共享资源。可以使用单例模式扩展LiveData对象以包装系统服务,以便可以在应用程序中共享它们,同时有遵守了以上生命周期
2. LiveData简单使用示例
先放一个XML文件,里面就2个TextView,用来做效果演示
首先声明,LiveData一般在Activity生命周期处于onStop或者onPause时,不回调数据更新,直至生命周期为onResume时,立即回调
Activity生命周期忘了?没关系,上图!
- onResume:resume表示继续、重新开始。
- onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。
- onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="onlyLive"
type="String" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="单独使用LiveData设置数据@" />
<TextView
android:id="@+id/txt_only_live"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{onlyLive}" />
</LinearLayout>
</LinearLayout>
</layout>
Activity代码
class LiveDataActivity : AppCompatActivity() {
private lateinit var binding: ActivityLivedataBinding
private val liveData = MutableLiveData<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_livedata)
binding = DataBindingUtil.setContentView(this, R.layout.activity_livedata)
binding.onlyLive = liveData.value
//数据改变监听
//数据改变监听
liveData.observe(this, Observer<String?> {
binding.onlyLive = it
Log.d("观察LiveData", "单独使用LiveData ==> $it")
})
}
override fun onStop() {
super.onStop()
liveData.postValue("单独LiveData使用")
}
}
Demo展示
首先进入APP -> Back to home -> 再次进入APP
也就是重新开始onResume,回调数据则文本更新,周期调用如图


LiveData与DataBinding双向绑定以及配合ViewModel使用
目前使用LiveData需要监听才能使用,但是DataBinding也可以进行数据绑定且比LiveData更加方便,为啥还要LiveData呢?以下做一个演示建一个测试类,用到我们的ObservableField
class TestBean {
val name = ObservableField<String>()
private fun setName(name: String) {
this.name.set(name)
}
}
class LiveDataViewModel : ViewModel() {
private val nameLiveData = MutableLiveData<String>()
fun getData(): MutableLiveData<String> {
return nameLiveData
}
}
- Activity代码和XML代码在文末链接的Demo里

- 发现DataBinding双向绑定也跟随生命周期了。LiveData配合ViewModel使用,不用监听也能绑定数据。