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

时间:2017-02-24 20:26:44

标签: android rx-java rx-binding

我正在使用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(),以便在新查询的结果到达时忽略旧查询的结果。

1 个答案:

答案 0 :(得分:1)

您必须处理此错误并返回对象。例如,您可以通过onErrorResumeNext运算符使用apiService.getSearchResults(query)调用来执行此操作。您要返回的内容 - 取决于您,如果您愿意,您甚至可以返回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的简单示例,实际上您需要编写错误处理逻辑。最好返回包装器,因为如果使用RxJava 2,则它不支持null