问题现象:
连续调用多次 LiveData 的 postValue 方法,结果只有最后一次响应,前面的消息都被吞了
问题原因:
postValue 方法实现在
androidx.lifecycle.LiveData#postValue
protected void postValue(T value) {
boolean postTask;
synchronized(this.mDataLock) {
postTask = this.mPendingData == NOT_SET;
this.mPendingData = value;//1
}
if (postTask) {
ArchTaskExecutor.getInstance().postToMainThread(this.mPostValueRunnable);//2
}
}
ArchTaskExecutor 本质是一个主线程的 Handler,所以 postValue 方法其实是使用 Handler 的 post 方法来实现在主线程通知 Observer 对象的。
注释 1 处 mPendingData 用于储存即将修改的值。
再看 mPostValueRunnable 的定义
public LiveData() {
this.mPendingData = NOT_SET;
class NamelessClass_1 implements Runnable {
NamelessClass_1() {
}
public void run() {
Object newValue;
synchronized(LiveData.this.mDataLock) {
newValue = LiveData.this.mPendingData;//1
LiveD

本文解析了LiveData中postValue方法消息丢失问题,探讨了原因在于postValue和setValue操作的时间差。提出了使用setValue替代和优化业务逻辑两种解决方案。
432

被折叠的 条评论
为什么被折叠?



