Android Reactivex可观察阻塞UI线程

Android Reactivex可观察阻塞UI线程,android,mvvm,kotlin,rx-java,reactivex,Android,Mvvm,Kotlin,Rx Java,Reactivex,因此,我在Rx中使用MVVM模式,问题是当我运行假定在后台线程中运行的操作时,我的UI线程被阻塞,这是我的viewmodel: class dataViewModel (application: Application): AndroidViewModel(application) { val dataRepository = DataRepository.getInstance(application.applicationContext) val listDa

因此,我在Rx中使用MVVM模式,问题是当我运行假定在后台线程中运行的操作时,我的UI线程被阻塞,这是我的viewmodel:

class dataViewModel (application: Application): AndroidViewModel(application) {
        val dataRepository = DataRepository.getInstance(application.applicationContext)
        val listData = MutableLiveData<List<Data>>()
        var isLoading = MutableLiveData<Boolean>()

        fun loadData(){
            isLoading.value = true
            dataRepository.getData().subscribeOn(Schedulers.newThread())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeWith(object: DisposableObserver<List<Data>>(){
                        override fun onComplete() {
                            //Update UI
                            isLoading.value = false
                        }
                        override fun onNext(retrievedData: List<data>) {
                            listData.value = retrievedData
                        }
                        override fun onError(e: Throwable) {
                            //Handle error
                        }
                    })
        }
    }
class dataViewModel(应用程序:应用程序):AndroidViewModel(应用程序){
val dataRepository=dataRepository.getInstance(application.applicationContext)
val listData=MutableLiveData()
var isLoading=MutableLiveData()
fun loadData(){
isLoading.value=true
dataRepository.getData().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(对象:DisposableObserver(){
覆盖有趣的onComplete(){
//更新用户界面
isLoading.value=false
}
覆盖下一步(检索数据:列表){
listData.value=检索到的数据
}
覆盖有趣的错误(e:可丢弃){
//处理错误
}
})
}
}
这是存储库方法:

fun getData(): Observable<List<Data>> {
    var dataList = query.search //this query may take a while and blocks the UI thread
    return Observable.just(dataList)
}
fun getData():可观察{
var dataList=query.search//此查询可能需要一段时间并阻塞UI线程
返回可观察的.just(数据列表)
}

我遗漏了什么?

您只是在rx链之外调用您的重量级op,这就是它阻塞的原因。尝试将长时间运行的op打包到,例如,
Observable.fromCallable
,块的所有剩余部分(
subscribeOn…
)如下所示。

您的
查询。搜索发生在UI线程中,因为您在Rx操作员参与之前调用它。您应该将
getData
方法更改为

fun getData(): Observable<List<Data>> {
    return Observable.fromCallable {
        query.search()
    }
}
fun getData():可观察{
返回Observable.fromCallable{
query.search()
}
}

在这种情况下,
query.search
将在该Rx链中定义的任何线程中调用(使用
subscribeOn
)。

它会阻塞,因为您甚至在主线程上RxJava参与之前就进行了计算。请阅读
just
的javadoc和。这是答案,非常感谢!我想我得仔细看一下文件