Android LiveData:未收到所有通知
我正在尝试使用Android的 LiveData .我只是试图向观察LiveData对象的观察者推送很多通知.我让线程在后台运行,并在while循环中通过LiveData的postValue方法不断推送随机值.在观察者中观察实时数据的通知的数量(onChanged()回调的数量)比后台线程中postValue的调用数量少得多.
I'm experimenting with Android's LiveData. I just tried to push a lot of notifications to an observer that observes a LiveData object. I let a thread run in background and in a while-loop i constantly push random values via LiveData's postValue-method. The number of received notifications (number of onChanged()-callbacks) in the observer which observes the livedata is much less then the number of calls of postValue in the background thread.
有人可以解释这是什么原因吗?
Can somebody explain what's the reason for this?
提前谢谢
解释在于postValue
和mPostValueRunnable
的实现:
protected void postValue(T value) {
boolean postTask;
synchronized (mDataLock) {
//this is true on the first run or right after the observer receives an update
postTask = mPendingData == NOT_SET;
mPendingData = value;
}
// this statement will be true if the observer hasn't received an update even though it's sent to the main looper
if (!postTask) {
return;
}
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
private final Runnable mPostValueRunnable = new Runnable() {
@Override
public void run() {
Object newValue;
synchronized (mDataLock) {
newValue = mPendingData;
mPendingData = NOT_SET;//once this value is reset a new mPostValueRunnable can be sent
}
// here the observer will receive the update
setValue((T) newValue);
}
};
- 在第一次运行时,在
postValue
mPendingData = NOT_SET
中,因此以下if (!postTask)
条件为false
,因此mPostValueRunnable
被发送到主线程. - 在第二次运行中,如果尚未执行
mPostValueRunnable
(由于值的更新非常频繁,因此可能未执行),if
为true
,因此没有任何内容发送到主线程,除了mPendingData
设置为新值. - 在第三次运行中,它可以与上一次相同,以此类推,以进行一些更新.因此,直到
mPostValueRunnable
实际运行并将mPendingData
重置为NOT_SET
,除最后一个更新值外,所有更新值都将丢失.在这种情况下,通过Observer
仅更新一次具有最新值.
- On the first run, in
postValue
mPendingData = NOT_SET
so the followingif (!postTask)
condition isfalse
and thusmPostValueRunnable
is sent to the main thread. - On the second run, if the
mPostValueRunnable
hasn't been executed yet (it may not as values are updated extremely frequently), theif
istrue
and so nothing is sent to the main thread except thatmPendingData
is set to a new value. - On the third run, it can be the same as on the previous one and so on for some number of updates. Thereof, until
mPostValueRunnable
actually runs and resetsmPendingData
toNOT_SET
, all the update values are lost except for the last one. In this case, only one update comes viaObserver
with the latest value.