返回
如何自定义LiveData粘性数据?
Android
2023-09-27 11:30:05
LiveData数据粘性实现原理
LiveData底层是通过AtomicBoolean
来维护数据粘性的,当数据发生更新时,LiveData内部会将AtomicBoolean
设置为true
,订阅者在订阅时会根据AtomicBoolean
来判断LiveData是否含有需要更新的数据,从而决定是否调用数据更新回调。
LiveData粘性数据自定义实战
- 自定义粘性数据类
class StickyLiveData<T> : MutableLiveData<T>() {
private var isSticky = false
fun setSticky(sticky: Boolean) {
isSticky = sticky
}
override fun setValue(value: T) {
super.setValue(value)
isSticky = true
}
override fun postValue(value: T) {
super.postValue(value)
isSticky = true
}
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner, object : Observer<T> {
override fun onChanged(t: T) {
if (isSticky || hasActiveObservers()) {
observer.onChanged(t)
}
}
})
}
}
- 使用自定义粘性数据类
val liveData = StickyLiveData<String>()
liveData.observe(this) {
// 可以接收到数据更新回调
}
liveData.value = "Hello World"
// 取消粘性数据
liveData.setSticky(false)
liveData.value = "Goodbye World"
// 不会接收到数据更新回调
}
LiveData数据倒灌进任意节点
- 自定义倒灌数据类
class ReverseLiveData<T> : MutableLiveData<T>() {
private var isReverse = false
fun setReverse(reverse: Boolean) {
isReverse = reverse
}
override fun setValue(value: T) {
if (isReverse) {
super.postValue(value)
} else {
super.setValue(value)
}
}
override fun postValue(value: T) {
if (isReverse) {
super.setValue(value)
} else {
super.postValue(value)
}
}
}
- 使用自定义倒灌数据类
val liveData = ReverseLiveData<String>()
liveData.observe(this) {
// 可以接收到数据更新回调
}
liveData.value = "Hello World"
// 设置倒灌数据
liveData.setReverse(true)
liveData.value = "Goodbye World"
// 可以接收到数据更新回调
}
总结
LiveData粘性数据自定义和LiveData数据倒灌进任意节点都是利用LiveData数据粘性的特性实现的,通过自定义LiveData类,我们可以实现各种有趣的数据更新逻辑,满足不同的业务需求。