Некоторые из нескольких одновременных вызовов для установки LiveData не наблюдаются - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть функция для совершения сетевых звонков. Его можно вызывать несколько раз одновременно, и каждый вызов выполняется одновременно.

getDataTask() // it is subscribed on the background thread and observed on the main thread
    .subscribe(
        { result -> onResult(result) },
        { onError() }
    )
    .addToDisposables()

Я могу получить данные без проблем. Функция onResult обновляет поле MutableLiveData в ViewModel как

private val _data = MutableLiveData<Data>()
val data: LiveData<Data> get() = _data

private fun onResult(result: Data) = _data.post(result)

И поле должно наблюдаться в методе Fragment s onViewCreated как

viewModel.data.observe(viewLifecycleOwner, Observer { data -> // DO SOMETHING })

Когда параллельные вызовы выполняются успешно и пытаются обновить поле _data, я заметил, что наблюдатель не наблюдает некоторые результаты. Например, одновременно запускаются 4 одновременных вызова, после чего они пытаются опубликовать свои результаты, а 1 или 2 из результатов не наблюдаются. Как я могу решить эту проблему? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 24 апреля 2020

Проблема, как я полагаю, возникает из-за природы LiveData. LiveData значение Observable ViewHolder просто выдаст только последнее обработанное значение.

Теперь я понимаю, что вы делаете одновременные вызовы, и в этом нет ничего плохого с этим. Если вы хотите сэкономить время выполнения в сети, то это путь к go. Однако, если вы хотите, чтобы этот параллелизм работал с вашим экземпляром LiveData, и вы хотите, чтобы ваш LiveData испускал все значения, которые он обрабатывает, как только параллельный метод успешно возвращает, тогда вы можете использовать LiveData неправильно.

То, что вы ищете, это LiveData's Observable nature. Вы получаете бесплатно lifecycle aware часть, но опять же это не ваша обычная Observable, а специальная, которая сохраняет только последнее значение.

В вашем случае, когда вы хотите обработать каждое значение, лучше использовать RxJava's Observable. Вы также можете настроить его жизненный цикл, набрав subscribing & unsubscribing в своем activity or fragment. У вас так много операторов в RxJava, что один из них наверняка вам поможет, пара, я думаю, это switchMap и Map.

...