一、介绍
是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
1.使用 LiveData 的优势
使用 LiveData 具有以下优势:
1.1、确保界面符合数据状态
LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer
对象中更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。
1.2、不会发生内存泄漏
观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。
1.3、不会因 Activity 停止而导致崩溃
如果观察者的生命周期处于非活跃状态(如返回堆栈中的 activity),它便不会接收任何 LiveData 事件。
1.4、不再需要手动处理生命周期
界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。
1.5、数据始终保持最新状态
如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。
1.6、适当的配置更改
如果由于配置更改(如设备旋转)而重新创建了 activity 或 fragment,它会立即接收最新的可用数据。
1.6、共享资源
您可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData
对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData
对象。如需了解详情,请参阅扩展 LiveData。
二、创建 LiveData 对象
LiveData 是一种可用于任何数据的封装容器,其中包括可实现 Collections
的对象,如 List
。LiveData 对象通常存储在 ViewModel 对象中,并可通过 getter 方法进行访问
class MyViewModel : ViewModel() {
private val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
fun getCuttentLiveData(): MutableLiveData<String> {
return currentName;
}
}
class MyViewModelActivity:BaseActivity() {
private var viewModel:MyViewModel?=null
private lateinit var bind: MyLiveDataDemo
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bind=DataBindingUtil.setContentView(this, R.layout.layout_livedata_demo)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
val obsver=Observer<String>(){
bind.textResult.setText(it)
}
viewModel?.getCuttentLiveData()?.observe(this,obsver)
//更新 LiveData 对象
bind.btnClickLivedata.setOnClickListener {
viewModel?.getCuttentLiveData()?.value="我更新了"
}
}
}
2.1 更新 LiveData 对象
bind.btnClickLivedata.setOnClickListener {
viewModel?.getCuttentLiveData()?.value="我更新了"
}
//或者
bind.btnClickLivedata.setOnClickListener {
viewModel?.getCuttentLiveData()?.postValue("我更新了")
}
2.2 转换 LiveData
您可能希望在将 LiveData 对象分派给观察者之前对存储在其中的值进行更改,或者您可能需要根据另一个实例的值返回不同的 LiveData
实例。Lifecycle 软件包会提供 Transformations 类,该类包括可应对这些情况的辅助程序方法。
三、合并多个 LiveData 源
MediatorLiveData 是 LiveData 的子类,允许您合并多个 LiveData 源。只要任何原始的 LiveData 源对象发生更改,就会触发 MediatorLiveData
对象的观察者。
class TestLiveDataActivity : BaseActivity() {
lateinit var bind: MyLiveData
var mutaData1: MutableLiveData<String>? = null
var mutaData2: MutableLiveData<String>? = null
var mediatorLiveData: MediatorLiveData<String>? = null
var flag = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bind = DataBindingUtil.setContentView(this, R.layout.layout_livedata)
bind.btnLivedata.setOnClickListener {
if (flag) {
flag = false;
mutaData1?.postValue("mutaData1我更新了")
} else {
flag = true;
mutaData2?.value = "mutaData2我更新了"
}
}
mutaData1 = MutableLiveData()
mutaData2 = MutableLiveData()
mediatorLiveData = MediatorLiveData()
mediatorLiveData?.addSource(mutaData1!!, Observer<String> {
mediatorLiveData?.value = it
})
mediatorLiveData?.addSource(mutaData2!!, Observer<String> {
mediatorLiveData?.value = it
})
mediatorLiveData?.observe(this, Observer {
bind.textUpdate.setText(it)
})
}
}
四、总结
livedata的主要解决了解耦,以及防止内存泄露具有特别好的效果。在复杂的项目,可以很好的维护项目的稳定性。减少开发人员对未知的情况进行提早处理。也是MVVM模式的伴侣与必杀技。