使用onErrorReturnItem rxJava重试链接

时间:2017-11-01 11:39:47

标签: rx-java2

我创建了一个可观察的

Observable<Map<Integer, String>> observable = Observable.create(s -> {
            try {
                System.out.println("getMultipleCitiesName ==="+Thread.currentThread().getName());
                List<String> cityIdsString = new ArrayList<>();

                for (Integer cityId : cityIds) {
                    cityIdsString.add(cityId.toString());
                }
                MultiValueMap<String, String> formParams = new LinkedMultiValueMap<>();
                formParams.put("cityIds[]", cityIdsString);

                // Call the Location Client to call the API
                Response<Map<Integer, String>> response = locationClient.getMultipleCitiesName(formParams);
                s.onNext(response.getData());

            } catch (Exception e) {
                System.out.println("Inside Exception CITY NEW");
                s.onError(e);
            }

            s.onComplete();
        });

现在我想添加onErrorReturnItem()和retry()两者。

所以我尝试了两种方式

a) observable = observable.onErrorReturnItem(new HashMap<>()).retry(3);
b) observable = observable.retry(3).onErrorReturnItem(new HashMap<>());

b)正在运行(意味着重试和onErrorReturnItem)两者都在工作 在 a)重试不起作用?

为什么会这样

1 个答案:

答案 0 :(得分:1)

运营商的顺序很重要,这就是你必须解释链条的方式:

(a)你正在说类似的东西让我们看看来自observable的任何东西,如果上游发生了一些错误,那么让一个observable发出一个空的HashMap(即调用onErrorReturnItem })然后retry在这个observable上(如果发出一些错误)。但是可观察的onErrorReturnItem没有发出错误,它只发出空HashMap后跟onComplete信号。即上游发生的错误被onErrorReturnItem隐藏,而retry永远不会发出onError信号以开始重试。

(b)你完全相反,让任何来自可观察的东西,如果上游发生了一些错误,请重试,如果重试不能在3次尝试后得到任何有效的项目,那么信号onError下游和onErrorReturnItem将返回空的HashMap

现在应该清楚为什么(b)倾向于成为你期待发生的事情。