Reactivex Observable阻止UI线程

问题描述 投票:0回答:2

所以我使用带有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)
}

我错过了什么?

android mvvm kotlin rx-java reactivex
2个回答
1
投票

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

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

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


0
投票

你只是在rx链之外调用你的重量级操作,这就是它阻塞的原因。尝试将长时间运行的操作包装到例如Observable.fromCallable中,其余部分(subscribeOn....)跟随。

© www.soinside.com 2019 - 2024. All rights reserved.