相关类型的文章很多,这里只做个人总结和其余的方法推荐
1.什么是数据倒灌?
所谓的“数据倒灌”:其实是类似粘性广播那样,当新的观察者开始注册观察时,会把上次发的最后一次的历史数据传递给当前注册的观察者。
一方面,用于通信的 LiveData 是被托管在 Activity / Application 级作用域 SharedViewModel 中,于是 LiveData 生存期长于任何一个 Fragment(假设通信双方是 Fragment):当二级 Fragment 出栈时,LiveData 实例仍存在。
另一方面,LiveData 本身被设计为粘性事件,也即,一旦 LiveData 持有数据,那么在观察者订阅该 LiveData 时,会被推送最后一次数据。
2.官方Demo的解决方法
java">public class SingleLiveData<T> extends MutableLiveData<T> {private final AtomicBoolean mPending = new AtomicBoolean(false);public SingleLiveData() {}public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {super.observe(owner, (t) -> {if (this.mPending.compareAndSet(true, false)) {observer.onChanged(t);}});}@MainThreadpublic void setValue(@Nullable T t) {this.mPending.set(true);super.setValue(t);}@MainThreadpublic void call() {this.setValue((Object)null);}
}
缺点:未解决多观察者消费的问题;
3.其余优秀的文章和github
简单粗暴解决LiveData『数据倒灌』的问题_livedata数据倒灌怎么解决-CSDN博客
https://github.com/KunMinX/UnPeek-LiveData/tree/master
重学安卓:LiveData 数据倒灌 “背景缘由全貌” 独家解析 - 小专栏