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()