使用 RxJava 搜索不工作
Searching with RxJava not working
我正在尝试进行简单搜索 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 然后终止,因此不再处理新事件。
正确的做法是什么?
我假设 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) }
此外,我认为您必须执行与特定网络调用相关的错误恢复和状态更改,否则失败将停止整个序列。
我正在尝试进行简单搜索 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 然后终止,因此不再处理新事件。
正确的做法是什么?
我假设 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) }
此外,我认为您必须执行与特定网络调用相关的错误恢复和状态更改,否则失败将停止整个序列。