Observer onChanged () не отправляет последний набор значений - PullRequest
0 голосов
/ 07 ноября 2018

Я использую LiveData и Room Database в BroadcastReceiver.

Основная идея состоит в том, чтобы выполнить один запрос к базе данных (вставить, удалить, получить) и переслать обновленное значение вызывающей стороне.

Благодаря Наблюдателю , слушающему объект LiveData , я могу получить обновленное значение. Затем значение передается вызывающей стороне через setResultData () .

Это мой BroadcastReceiver:

public class WordReceiver extends BroadcastReceiver {
...

    private List<Sring> mWordList;
    private WordItemViewModel mWordItemViewModel;
    private Observer<List<String>> mObserver;
    private boolean mActionPerformed = false;

...

    @Override
    public void onReceive(final Context context, final Intent intent) {
        final PendingResult result = goAsync();

        new Thread() {
            public void run() {
                manageActions(context, intent, result);
            }
        }.start()
    }

...

    private void manageActions(Context context, Intent intent, PendingResult result) {
        String action = intent.getAction();
        if (action == null) {
            return;
        }
        switch (action) {
            case WordReceiver.ACTION_ADD_WORD:
                initVariables(context, result);
                mActionPerformed = true;
                mWordItemViewModel.insert(intent.getStringExtra(WordReceiver.EXTRA_WORD);
                break;
            case WordReceiver.ACTION_REMOVE_WORD:
                initVariables(context, result);
                mActionPerformed = true;
                mWordItemViewModel.delete(intent.getStringExtra(WordReceiver.EXTRA_WORD);
                break;
            case WordReceiver.ACTION_GET_WORDS:
                // mActionPerformed is set to true because there is no action to perform
                mActionPerformed = true;
                initVariables(context, result);
                break;
            default:
                result.abortBroadcast();
                break;
        }
    }
}

Observer и AndroidViewModel инициализируются следующим образом:

private void initVariables(final Context context, final PendingResult result) {
    mWordItemViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance((Application) context.getApplicationContext()).create(WordItemViewModel.class);

    mObserver = new Observer<List<String>>() {
        @Override
        public void onChanged(@Nullable final List<String> wordList) {
            mWordList = wordList;

            if (mActionPerformed) {
                mWordItemViewModel.getAllWordItems().removeObserver(this);

                if (mWordList != null) {
                    String wordListText = TextUtils.join(",", mWordList);
                    result.setResultData(wordListText);
                }
                result.finish();
            }
        }
    };

    mWordItemViewModel.getAllWordItems().observeForever(mObserver);
}

Это работает, , но не всегда !

Иногда параметр wordList в onChanged () учитывает добавленное / удаленное Word, иногда нет.

Согласно https://developer.android.com/reference/android/arch/lifecycle/LiveData#getvalue

Возвращает текущее значение. Обратите внимание, что вызов этого метода на Фоновый поток не гарантирует, что последний набор значений будет получил.

Я не использую getvalue () , но мне интересно, может ли метод onChanged () иметь такое же поведение.

Большое спасибо ...

...