我正在尝试使用Android的LiveData。我只是试图向观察LiveData对象的观察者推送很多通知。我让线程在后台运行,并在while循环中通过LiveData的postValue方法不断推送随机值。在观察者中观察实时数据的通知的数量(onChanged()回调的数量)比后台线程中postValue的调用数量少得多。
有人可以解释这是什么原因吗?
提前谢谢
答案 0 :(得分:1)
解释在于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
仅更新一次具有最新值。