返回

如何自定义LiveData粘性数据?

Android

LiveData数据粘性实现原理

LiveData底层是通过AtomicBoolean来维护数据粘性的,当数据发生更新时,LiveData内部会将AtomicBoolean设置为true,订阅者在订阅时会根据AtomicBoolean来判断LiveData是否含有需要更新的数据,从而决定是否调用数据更新回调。

LiveData粘性数据自定义实战

  1. 自定义粘性数据类
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)
                }
            }
        })
    }
}
  1. 使用自定义粘性数据类
val liveData = StickyLiveData<String>()

liveData.observe(this) {
    // 可以接收到数据更新回调
}

liveData.value = "Hello World"

// 取消粘性数据
liveData.setSticky(false)

liveData.value = "Goodbye World"

// 不会接收到数据更新回调
}

LiveData数据倒灌进任意节点

  1. 自定义倒灌数据类
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)
        }
    }
}
  1. 使用自定义倒灌数据类
val liveData = ReverseLiveData<String>()

liveData.observe(this) {
    // 可以接收到数据更新回调
}

liveData.value = "Hello World"

// 设置倒灌数据
liveData.setReverse(true)

liveData.value = "Goodbye World"

// 可以接收到数据更新回调
}

总结

LiveData粘性数据自定义和LiveData数据倒灌进任意节点都是利用LiveData数据粘性的特性实现的,通过自定义LiveData类,我们可以实现各种有趣的数据更新逻辑,满足不同的业务需求。