Последовательность событий Android LiveData гарантирует? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть следующий код в моем фрагменте, подписывающийся на события LiveData моего ViewModel.

    viewModel.successfullyAddedEvent.observeEvent(this){
        // do result handling by shared view model to the calling fragment
        result.successfullyAddedEvent.postValue(Event(it))
        findNavController().navigateUp()
    }

    viewModel.successfullyEditedEvent.observeEvent(this){
        // do result handling by shared view model to the calling fragment
        result.successfullyEditedEvent.postValue(Event(it))
        findNavController().navigateUp()
    }

    viewModel.exitRequestedEvent.observeEvent(this){
        when(it){
            ExitReason.GetDetailsFailed -> {
                Toast.makeText(context, R.string.details_load_error, LENGTH_SHORT).show()
            }
            ExitReason.UserCanceled -> { /* happy path */ }
        }

        findNavController().navigateUp()
    }

У меня есть три места в этом коде, куда я звоню navigateUp, и я бы хотел немного объединить навигацию.

Кажется, что было бы улучшением кода - выдавать ExitRequestedEvent из каждого случая (успешное добавление, успешное редактирование, ошибка, отмена пользователя) и удалять вызовы navigateUp из этих событий, но я не уверен насчет гарантий при получении заказа. То есть, если бы я должен был публиковать значения для successfullyAddedEvent, а затем exitRequestedEvent в моей модели представления следующим образом:

// yay my thing happened successfully, emit events
successfullyAddedEvent.postValue(Event(contentAdded))
exitRequestedEvent.postValue(Event(ExitReason.AddSuccessful))

Можно ли гарантировать, что я обработаю событие add (которое устанавливает результат для общего результата ViewModel) перед выходом из этого фрагмента, чтобы вызывающий фрагмент всегда имел результат?

1 Ответ

1 голос
/ 23 мая 2019

В соответствии с документацией , postValue означает просто опубликовать задачу в главном потоке, если вы не в ней, поэтому, если у вас нет setValue где-то в вашем коде, порядок должен бытьгарантировано.

Если вы хотите абсолютно гарантировать заказ (хотя и не обязательно), вы можете использовать setValue() для этого, но вы должны убедиться, что это происходит в главном потоке.

...