解决LiveData多次回调的问题
class SingleLiveEvent<T> : MutableLiveData<T>() {
private val mPending: AtomicBoolean = AtomicBoolean(false)
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner, Observer<T> { t ->
if (mPending.compareAndSet(true, false)) {
observer.onChanged(t)
}
})
}
@MainThread
override fun setValue(t: T?) {
mPending.set(true)
super.setValue(t)
}
override fun postValue(value: T?) {
mPending.set(true)
super.postValue(value)
}
@MainThread
fun call() {
value = null
}
}
解决LiveData数据倒灌问题
class LockedLiveEvent<T> : MutableLiveData<T>() {
open inner class WrapperObserver(
private val stick: Boolean = false,
private val observer: Observer<in T>
) : Observer<T> {
private val isFirstObserver: AtomicBoolean = AtomicBoolean(true)
override fun onChanged(t: T) {
if (mLock.get() && !stick) {
if (isFirstObserver.compareAndSet(false, false)) {
observer.onChanged(t)
}
} else {
isFirstObserver.set(false)
observer.onChanged(t)
}
}
}
private val mLock: AtomicBoolean = AtomicBoolean(true)
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
observe(owner, false, observer)
}
fun observe(owner: LifecycleOwner, stick: Boolean = false, observer: Observer<in T>) {
mLock.set(true)
super.observe(owner, WrapperObserver(stick, observer))
}
override fun observeForever(observer: Observer<in T>) {
observeForever(false, observer)
}
fun observeForever(stick: Boolean = false, observer: Observer<in T>) {
mLock.set(true)
super.observeForever(WrapperObserver(stick, observer))
}
@MainThread
override fun setValue(t: T?) {
mLock.set(false)
super.setValue(t)
}
override fun postValue(value: T?) {
mLock.set(false)
super.postValue(value)
}
@MainThread
fun call() {
value = null
}
}