Reactivex Observable 阻塞 UI 线程
Reactivex Observable blocking UI thread
所以我在 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)
}
我是不是漏了什么?
你只是在 rx 链之外调用你的重量级操作,这就是它阻塞的原因。尝试将长 运行 op 打包到 Observable.fromCallable
中,然后是所有其他块 (subscribeOn....
)。
您的 query.search
发生在 UI 线程中,因为您在 Rx 操作员参与之前调用它。您应该将 getData
方法更改为
fun getData(): Observable<List<Data>> {
return Observable.fromCallable {
query.search()
}
}
在这种情况下,query.search
将在此 Rx 链中定义的任何线程中调用(使用 subscribeOn
)。
所以我在 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)
}
我是不是漏了什么?
你只是在 rx 链之外调用你的重量级操作,这就是它阻塞的原因。尝试将长 运行 op 打包到 Observable.fromCallable
中,然后是所有其他块 (subscribeOn....
)。
您的 query.search
发生在 UI 线程中,因为您在 Rx 操作员参与之前调用它。您应该将 getData
方法更改为
fun getData(): Observable<List<Data>> {
return Observable.fromCallable {
query.search()
}
}
在这种情况下,query.search
将在此 Rx 链中定义的任何线程中调用(使用 subscribeOn
)。