kotlin MutableLiveData 工作流程及原理
2023-07-04 本文已影响0人
coke613
MutableLiveData 它是Android Jetpack 架构组件中的一部分,用于在组件(如 Activity、Fragment、ViewModel 等)之间传递和共享数据。它是一种基于观察者-订阅者模式的数据持有类.
MutableLiveData工作原理
- 数据存储: MutableLiveData 内部维护着一个数据对象.可以是任意类型.这个数据对象可以通过setValue()方法进行更新.
- 生命周期感知: MutableLiveData 与组件的生命周期相关联,它会在组件活跃状态下通知观察者(例如activity 或者 fragment),并在组件非活跃状态下自动取消通知.以防止潜在的内存泄露.
- 观察者模式: MutableLiveData 实现了观察者模式,允许其他组件注册为观察者并接收数据的更新通知.当数据发生变化时,注册的观察者将收到更新的数据.
在观察者- 订阅者模式中,存在两个主要角色:
- 观察者模式: MutableLiveData 实现了观察者模式,允许其他组件注册为观察者并接收数据的更新通知.当数据发生变化时,注册的观察者将收到更新的数据.
- a. 观察者(Observer): 观察者是一个对象,它监听被观察对象的变化,并在变化时接收通知.在Android 中,通常是ui组件如(Activity,Fragment) 充当观察者,它们可以订阅并接收被观察者对象的变化.
- b. 被观察者(Observable):被观察者是一个对象,它持有数据并在数据发生变化时通知观察者.在Android中 'MutableLiveData' 就是一种被观察者对象,它可以持有数据,并在数据发生变化的时候通知所有观察者.
- 4.线程安全: MutableLiveData 保证数据更新操作是在主线程上进行的.这样可以确保观察者在主线程接受数据变化的通知,以便正确处理UI更新.
MutableLiveData 执行流程
// 在 ViewModel 中
val data = MutableLiveData<String>()
// 在 ViewModel 中 更新数据
fun updateData(newData: String) {
data.value = newData
}
// 在 Activity 中订阅数据变化
viewModel.data.observe(this, Observer { value ->
// 处理数据变化,更新 UI 等操作
})
MutableLiveData是LiveData 的子类,具有可变的特性,可以通过调用setValue()或者postValue()方法来更新数据.
setValue, postValue 有什么区别.
setValue()和postValue()是MutableLiveData类中用于更新数据的两种方式.它们在使用方式和线程安全性方面略有不同.
-
setValue(): 该方法是在主线程中调用的,用于更新MutableLiveData的值.这就意味着你只能在主线程中调用setValue(),否则会抛出异常.setValue()方法会立即将新的值分发给所有的观察者,即时当前线程是主线程.
-
postValue(): 该方法是线程安全的,可以在任何线程中调用,包括主线程和后台线程.它会将数据更新的操作添加到主线程的消息队列中,在主线程空闲时进行处理.这样可以确保数据的更新都是在主线程上进行.避免了跨线程访问的问题.
区别总结如下:
- setValue()方法必须在主线程中调用,立即分发数据更新给观察者.
- postValue()方法可以在任何线程中调用,将数据更新操作添加到消息队列中,确保在主线程上进行数据分发.
// 在 ViewModel 中
val data = MutableLiveData<String>()
// 在 ViewModel 中 更新数据 确保在主线程调用
fun updateData(newData: String) {
data.value = newData
}
//在 ViewModel 子线程中更新数据.
fun postUpdateData(newData: String){
Thread{
data.postValue(newData)
}.start()
}
// 在 Activity 中订阅数据变化
viewModel.data.observe(this, Observer { value ->
// 处理数据变化,更新 UI 等操作
})