使用RxJava搜索不起作用

时间:2017-09-21 13:19:40

标签: android kotlin rx-java2

我正在尝试做一个简单的搜索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然后终止,因此不再处理新事件。

这样做的正确方法是什么?

1 个答案:

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

此外,我认为你必须进行与特定网络调用相关的错误恢复和状态更改,否则失败将停止整个序列。