【问题标题】:Reactivex Observable blocking UI threadReactivex Observable 阻塞 UI 线程
【发布时间】:2019-07-17 00:29:12
【问题描述】:

所以我在 Rx 中使用 MVVM 模式,问题是当我运行假设在后台线程中运行的操作时,我的 UI 线程被阻塞,这是我的视图模型:

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

我错过了什么?

【问题讨论】:

  • 它阻塞是因为你在 之前 进行计算,甚至在主线程上涉及 RxJava。请阅读justGetting started 的javadoc。

标签: android mvvm kotlin rx-java reactivex


【解决方案1】:

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

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

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

【讨论】:

  • 这就是答案,非常感谢!我想我必须仔细看看文档
【解决方案2】:

您只是在 rx 链之外调用您的重量级操作,这就是它阻塞的原因。尝试将您长期运行的操作打包到例如 Observable.fromCallable 中,然后您的所有其他块 (subscribeOn....) 跟随。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多