RxJava:即使发生错误也继续下一次迭代

RxJava: Continue next iteration even if error occurs

我正在使用 RxSearchView 将搜索查询的结果从 API 发送到 recyclerview。但是,如果其中一个查询失败,将调用 onError()(这是预期的),但整个订阅也会被取消。后续查询根本不执行。

我应该如何修改代码,以便在查询失败时阻止对 onError() 的调用,并正常执行下一个传入查询?

这是一个代码片段:

subscription = RxSearchView.queryTextChanges(searchView)
                .debounce(500, MILLISECONDS)
                .filter(charSequence -> !TextUtils.isEmpty(charSequence))
                .map(CharSequence::toString)
                .subscribeOn(AndroidSchedulers.mainThread())
                .observeOn(Schedulers.io())
                .switchMap(query -> apiService.getSearchResults(query))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<SearchResponse>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(SearchResponse searchResponse) {
                        if (searchResponse.getStatus().equals("OK")) {
                            //update Adapter
                        } else {
                            //update error views
                        }
                    }

                }); 

P.S:我正在使用 switchMap() 以便在新查询的结果到达时忽略旧查询的结果。

您必须处理此错误并 return 一个对象。例如,您可以通过将 onErrorResumeNext 运算符与 apiService.getSearchResults(query) 调用一起使用来实现。你要做什么 return - 取决于你,你甚至可以 return null 如果你愿意,但最好创建一些包装器,它可以携带响应状态标志和正常响应(如果收到) .

类似于:

subscription = RxSearchView.queryTextChanges(searchView)
            .debounce(500, MILLISECONDS)
            .filter(charSequence -> !TextUtils.isEmpty(charSequence))
            .map(CharSequence::toString)
            .subscribeOn(AndroidSchedulers.mainThread())
            .observeOn(Schedulers.io())
            .switchMap(query -> apiService
                                   .getSearchResults(query)
                                   .onErrorResumeNext(error -> null)
            )
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<SearchResponse>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(SearchResponse searchResponse) {
                    if (searchResponse != null && searchResponse.getStatus().equals("OK")) {
                        //update Adapter
                    } else {
                        //update error views
                    }
                }

            }); 

当然,这是使用 null 的简单示例,实际上您需要编写错误处理逻辑。最好是 return 包装器,因为如果使用 RxJava 2,那么它不支持 null