我正在尝试做一个简单的搜索UI,其中文本更改会触发服务中的搜索并将其映射到ViewState。这看起来很简单,但以下代码不起作用:
queryText.filter { it.length > 3 }
.switchMap { service.search(it) }
.onErrorReturn { SearchResponse(null, it.message) }
.map { SearchViewState(items = it.items, error = it.error) }
.startWith { SearchViewState(loading = true) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { viewState.onNext(it) }
我不知道我做错了什么,但是通过调试我可以看到流抛出NetworkOnMainThreadException然后终止,因此不再处理新事件。
这样做的正确方法是什么?
答案 0 :(得分:2)
我认为queryText
是主线程上发生的文本更改的来源。因此subscribeOn
对此没有影响。您应该将subscribeOn
应用于实际的网络呼叫:
queryText.filter { it.length > 3 }
.switchMap {
service.search(it)
.subscribeOn(Schedulers.io())
.onErrorReturn { SearchResponse(null, it.message) }
.map { SearchViewState(items = it.items, error = it.error) }
.startWith ( SearchViewState(loading = true) )
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe { viewState.onNext(it) }
此外,我认为你必须进行与特定网络调用相关的错误恢复和状态更改,否则失败将停止整个序列。