Конвертировать наблюдаемыек списку <T> - PullRequest
0 голосов
/ 07 июля 2019

Я хочу получить MutableLiveData<List<Country>>() объект от Observable<List<Country>>, но я не могу найти способ.

Я использую реализацию ниже, но она не работает. Есть ли другой способ добиться этого, или я делаю что-то не так с моей текущей реализацией?

dataManagerAnonymous.countries.toList().blockingGet().single()

Приведенный выше код показывает NetworkOnMainThreadException и вызывает сбой приложения.

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Этот метод расширения преобразует Observable<T> в MutableLiveData<T>:

fun <T> Observable<T>.asMutableLiveData() = object : MutableLiveData<T>() {

    var disposable: Disposable? = null

    override fun onActive() {
        super.onActive()
        disposable = this@asMutableLiveData.subscribe(this::postValue)
    }

    override fun onInactive() {
        super.onInactive()
        disposable?.dispose()
    }
}

...

dataManagerAnonymous.countries.asMutableLiveData()
0 голосов
/ 07 июля 2019
dataManagerAnonymous
    .countires
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { result ->
        // result is List<Country>
    }

dataManagerAnonymous.countires, вероятно, выполняет сетевой запрос, который должен выполняться в фоновом потоке, чтобы предотвратить блокирование потока пользовательского интерфейса. subscribeOn(Schedulers.io()) вызывает ваш запрос в фоновом потоке. observeOn(AndroidSchedulers.mainThread()) позволяет использовать результат этого вызова в потоке пользовательского интерфейса. Блок подписки будет вызван, когда ваш запрос будет успешно выполнен и данные результатов будут готовы к обработке.

...