Создание LiveData для наблюдения нескольких запросов на модернизацию в одном представлении - PullRequest
0 голосов
/ 03 февраля 2020

Я использую Retrofit 2.0 вместе с шаблоном MVVM в kotlin, и я могу наблюдать результаты API от Retrofit через репозиторий и ViewModel в моей деятельности.

Теперь мой вопрос заключается в том, что для каждого вызова API Я должен создать отдельную LiveData в ViewModel и параллельно отдельный наблюдатель для каждой LiveData в моей Деятельности, которая, по моему мнению, дублирует мой код. Я чувствую, что те же LiveData в ViewModel можно наблюдать в Activity, но основная проблема заключается в определении ответа API на каждый запрос. Есть ли способ определить это? Если да, мне просто нужно создать одного наблюдателя, и я могу обработать ответ каждого API на основе этого идентификатора.

Я много читал об этом в различных блогах, но ни один из них не дает ясного картина из лучших практик. Просить всех присутствующих прояснить мой путь и помочь мне сделать это наилучшим образом.

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

1 Ответ

0 голосов
/ 03 февраля 2020

вы можете создать параметр состояния с помощью перечисления или запечатанного класса, например:

enum class State { ApiOneSuccess, ApiTwoSuccess, Error }

, а затем вы создадите LiveData этого состояния в вашей ViewModel:

val liveState = MutableLiveData<State>()

Я не знать, что вы используете для обратного вызова API, но вы должны поместить liveState.postValue(ApiOneSuccess) в свой обратный вызов onSuccess для первого API и сделать то же самое для onError и второго API

, тогда вы можете наблюдать эти LiveData в onCreate своей активности и выполните правильные действия:

viewModel.liveState.observe(this) { state ->
            state?.also {
                when (it) {
                    ApiOneSuccess -> { // do what you need to do }
                    ApiOneSuccess -> { // do what you need to do }
                    Error -> { // do what you need to do }
                }
                viewModel.liveState.postValue(null)
            }
        }
    }

Надеюсь, концепция вам понятна

...