我创建了一个可观察的
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)重试不起作用?
为什么会这样
答案 0 :(得分:1)
运营商的顺序很重要,这就是你必须解释链条的方式:
(a)你正在说类似的东西让我们看看来自observable的任何东西,如果上游发生了一些错误,那么让一个observable发出一个空的HashMap
(即调用onErrorReturnItem
})然后retry
在这个observable上(如果发出一些错误)。但是可观察的onErrorReturnItem
没有发出错误,它只发出空HashMap
后跟onComplete
信号。即上游发生的错误被onErrorReturnItem
隐藏,而retry
永远不会发出onError
信号以开始重试。
(b)你完全相反,让任何来自可观察的东西,如果上游发生了一些错误,请重试,如果重试不能在3次尝试后得到任何有效的项目,那么信号onError
下游和onErrorReturnItem
将返回空的HashMap
。
现在应该清楚为什么(b)倾向于成为你期待发生的事情。