Android LiveData:未收到所有通知

时间:2018-06-25 20:03:08

标签: android frequency observer-pattern android-livedata

我正在尝试使用Android的LiveData。我只是试图向观察LiveData对象的观察者推送很多通知。我让线程在后台运行,并在while循环中通过LiveData的postValue方法不断推送随机值。在观察者中观察实时数据的通知的数量(onChanged()回调的数量)比后台线程中postValue的调用数量少得多。

有人可以解释这是什么原因吗?

提前谢谢

1 个答案:

答案 0 :(得分:1)

解释在于postValuemPostValueRunnable的实现:

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);
    }
};  
  1. 在第一次运行时,在postValue mPendingData = NOT_SET中,因此以下if (!postTask)条件为false,因此mPostValueRunnable被发送到主线程。
  2. 在第二次运行中,如果尚未执行mPostValueRunnable(由于值的更新非常频繁,因此可能未执行),则iftrue,因此没有任何发送除了将mPendingData设置为新值之外,还可以访问主线程。
  3. 在第三次运行中,它可以与上一次相同,以此类推,以进行一些更新。因此,直到mPostValueRunnable实际运行并将mPendingData重置为NOT_SET为止,所有更新值都将丢失,最后一个更新值除外。在这种情况下,通过Observer仅更新一次具有最新值。