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

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