Android LiveData: не получает все уведомления - PullRequest
0 голосов
/ 25 июня 2018

Я экспериментирую с Android LiveData .Я просто попытался отправить много уведомлений наблюдателю, который наблюдает за объектом LiveData.Я позволил потоку работать в фоновом режиме и в цикле while я постоянно выдвигал случайные значения с помощью метода postValue LiveData.Количество полученных уведомлений (количество обратных вызовов onChanged ()) в наблюдателе, который наблюдает живые данные, намного меньше, чем количество вызовов postValue в фоновом потоке.

Может кто-нибудь объяснить причину этого?

Заранее спасибо

1 Ответ

0 голосов
/ 26 июня 2018

Объяснение заключается в реализации для 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);
    }
};  
  1. При первом запуске в postValue mPendingData = NOT_SET, поэтому следующее условие if (!postTask)false и, таким образом, mPostValueRunnable отправляется в основной поток.
  2. Во время второго запуска, если mPostValueRunnable еще не был выполнен (это может быть не так, как значения обновляются очень часто),if равно true, и поэтому в основной поток ничего не отправляется, за исключением того, что mPendingData установлено новое значение.
  3. При третьем запуске оно может быть таким же, как и в предыдущем, ии так далее для некоторого количества обновлений.Вследствие этого, до тех пор, пока mPostValueRunnable фактически не запустится и не сбросит mPendingData в NOT_SET, все значения обновления будут потеряны, кроме последнего.В этом случае только одно обновление поступает через Observer с последним значением.
...