android - 如何避免 onError 停止 rxjava 中的异步流
问题描述
让我直奔问题。我有一个要进行的网络调用列表。我正在使用merge
运算符RxJava
来合并网络调用列表并按顺序执行它们,最后得到输出列表。现在我面临一个问题。如果任何网络调用在下一次网络调用之间失败,则不会进行并且执行停止。如何确保列表中的所有网络调用无论成功或失败都被执行?
Observable<String> op1 = service1.operation();
Observable<String> op2 = service2.operation();
Observable<String> op3 = service3.operation();
Observable<List<String>> lst = Observable.merge(op1, op2, op3).toList();
在这里,如果我观察到lst
它应该返回一个Strings
包含成功或失败结果的列表。
解决方案
异常是terminal event
rxjava 中的一个,它终止它发生的流(以及任何外部流,如果您不使用任何运算符来处理它)。但是,如果您将该流包装在内部流中并应用运算符onErrorReturnItem
,则可以避免它。无论如何,内部流将被终止,但不是onError
通过应用onErrorReturnItem
运算符传递给外部流,而是将传递onNext
给外部流,这样外部流就不会被终止:
public static Observable<String> serviceOperation(String param) {
return Observable.just(param)
.doOnNext(s -> {
//simulate error when param is "value 2"
if (s.equals("value 2")) {
throw new IllegalStateException("Something happened");
}
});
}
public static void main(String args[]) {
//here we create a stream and by using concatMap creating another inner stream
Observable<String> op1 = Observable.just(1)
.concatMap(integer -> {
return serviceOperation("value 1")
.onErrorReturnItem("Error");
});
Observable<String> op2 =Observable.just(1)
.concatMap(integer -> {
return serviceOperation("value 2")
.onErrorReturnItem("Error");
});
Observable<String> op3 = Observable.just(1)
.concatMap(integer -> {
return serviceOperation("value 3")
.onErrorReturnItem("Error");
});
Observable.merge(op1, op2, op3)
.toList()
.subscribe(strings -> strings.forEach(System.out::println), Throwable::printStackTrace);
}
这将打印:
value 1
Error
value 3
推荐阅读
- excel - 比较工作表值(文本和算术)
- android - 在 glide 库 v4.8.0 中没有缓存版本的 xxxcompiler:4.8.0 可用于离线模式错误
- sql - oracle SQL字符串中ASCII 255的含义
- c - 我在链表中插入数据的程序不起作用
- mysql - MYSQL 问题:它会在重要之前删除所有表
- opengl - Opengl glclipdistance vs glclipplane
- java - Files.move / file.renameTo 在多次迭代后都失败(Windows 10),绝对是一个 Java 错误
- javascript - 课后重置编号
- scala - 在持久类型的actor 2.5.17 中存储消息
- java - Chrome 驱动程序尝试在 CI 服务器中加载页面时超时,但在本地工作