Reactivex可观察到的阻塞UI线程

时间:2019-02-22 20:58:50

标签: android mvvm kotlin rx-java reactivex

所以Im在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
                        }
                    })
        }
    }

这是存储库方法:

fun getData(): Observable<List<Data>> {
    var dataList = query.search //this query may take a while and blocks the UI thread
    return Observable.just(dataList)
}

我想念什么吗?

2 个答案:

答案 0 :(得分:1)

您的query.search发生在UI线程中,因为您是在调用Rx运算符之前调用它的。您应该将getData方法更改为

fun getData(): Observable<List<Data>> {
    return Observable.fromCallable {
        query.search()
    }
}

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

答案 1 :(得分:0)

您只是在rx链之外调用您的重量级操作,这就是它被阻止的原因。尝试将运行时间长的op打包到Observable.fromCallable中,并紧随其后的所有其他代码块(subscribeOn....)。