Android 转换可观察值<;列表<;T>&燃气轮机;列出<;T>;

Android 转换可观察值<;列表<;T>&燃气轮机;列出<;T>;,android,kotlin,rx-java,rx-android,androidx,Android,Kotlin,Rx Java,Rx Android,Androidx,我想从Observable获取MutableLiveData()对象,但我找不到方法 我正在使用下面的实现,但它不起作用。是否有其他方法来实现它,或者我当前的实现是否有问题 dataManagerAnonymous.countries.toList().blockingGet().single() 上面的代码显示NetworkOnMainThreadException,并使应用程序崩溃。dataManagerAnonymous dataManagerAnonymous .countire

我想从
Observable
获取
MutableLiveData()
对象,但我找不到方法

我正在使用下面的实现,但它不起作用。是否有其他方法来实现它,或者我当前的实现是否有问题

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

上面的代码显示NetworkOnMainThreadException,并使应用程序崩溃。

dataManagerAnonymous
dataManagerAnonymous
    .countires
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { result ->
        // result is List<Country>
    }
伯爵夫人 .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .订阅{结果-> //结果是列表 }

dataManagerAnonymous.countires
可能执行网络请求,这应该在后台线程上执行,以防止UI线程阻塞
subscribeOn(Schedulers.io())
在后台线程上调用您的请求
observeOn(AndroidSchedulers.mainThread())
允许您在UI线程上使用此调用的结果。当您的请求已成功完成且结果数据已准备好处理时,将调用Subscribe块。

此扩展方法将
可观察的
转换为
可变的LiveData


可能的副本请清楚地写下你想要的。首先,你的标题问题和描述问题不一样。在标题中需要列表,而在描述中需要可变LiveData。同时,你在一篇文章中提出了两个问题。第一个问题与类型转换有关,第二个问题与线程有关,这是一个完全不同的主题。尽管如此,我相信这两个问题都有很多问题和答案。建议您在提问之前进行研究。让我们把社区组织得井井有条为什么
blockingGet()
会显示NetworkError,在某些地方它不会显示,而在某些地方,如上文所述,它会显示?@miploder blockingGet()会阻止当前线程,直到方法的结果可用为止。如果在主线程(用户界面线程)上调用blockingGet(),它将抛出一个错误。您不应该这样做,因为在网络呼叫结果到达之前,您的应用程序将被冻结(例如,单击按钮将不会被处理)。但是,如果在后台线程上调用blockingGet(),则不会出现错误。阻止后台线程并不会使你的应用程序无响应。然后只使用MutableLiveData而不是Observable。
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()