Fix LiveData multiple callbacks

/** * @author: Google * @date: 2020/11/4 * @description: Single event LiveData wrapper class, prevent data backflow; 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) } /** * Used for cases where T is Void, to make calls cleaner. */ @MainThread fun call() { value = null } }Copy the code

Solve the LiveData data flooding problem

/** * @author: Leo * @date: 2020/11/4 * @description: LiveData wraps classes to prevent data from being dumped. * Ensure that only observers registered before the event is sent can be notified; */ class LockedLiveEvent<T> : MutableLiveData<T>() { open inner class WrapperObserver( private val stick: Private val observer: observer <in T>) : Observer<T> {/** * isFirstObserver */ private val isFirstObserver: AtomicBoolean = AtomicBoolean(true) override fun onChanged(t: T) { if (mLock.get() && ! Stick) {// The current is a locked non-sticky observer and is a new observer, set to not a new observer. If it is not a new observer to inform the if (isFirstObserver.com pareAndSet (false, false)) {observer. OnChanged (t)}} else {/ / not locked or viscous observer, 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>) {// The new Observer locks the message to inform 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) } /** * Used for cases where T is Void, to make calls cleaner. */ @MainThread fun call() { value = null } }Copy the code