Я использую 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 () иметь такое же поведение.
Большое спасибо ...