1

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
                        }
                    }

                }); 

switchMap()PS:如果新查询的结果已经到达,我正在使用旧查询的结果被忽略。

4

1 回答 1

3

您必须处理此错误并返回一个对象。例如,您可以通过使用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.

于 2017-02-24T20:44:52.823 回答