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
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);
}
};
postValue
mPendingData = NOT_SET
so the following if (!postTask)
condition is false
and thus mPostValueRunnable
is sent to the main thread.mPostValueRunnable
hasn't been executed yet (it may not as values are updated extremely frequently), the if
is true
and so nothing is sent to the main thread except that mPendingData
is set to a new value.mPostValueRunnable
actually runs and resets mPendingData
to NOT_SET
, all the update values are lost except for the last one. In this case, only one update comes via Observer
with the latest value.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With