问题
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?
Thank you in advance
回答1:
The explanation lies in the implementation for postValue and 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);
}
};
- On the first run, in
postValuemPendingData = NOT_SETso the followingif (!postTask)condition isfalseand thusmPostValueRunnableis sent to the main thread. - On the second run, if the
mPostValueRunnablehasn't been executed yet (it may not as values are updated extremely frequently), theifistrueand so nothing is sent to the main thread except thatmPendingDatais 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
mPostValueRunnableactually runs and resetsmPendingDatatoNOT_SET, all the update values are lost except for the last one. In this case, only one update comes viaObserverwith the latest value.
来源:https://stackoverflow.com/questions/51031062/android-livedata-not-receiving-all-notifications