如何避免onError停止rxjava中的异步流

时间:2018-08-17 06:49:41

标签: android rx-java

让我直接解决这个问题。我有拨打网络电话的清单。我正在使用merge的{​​{1}}运算符来合并网络调用列表,并依次执行它们,最后获得输出列表。现在我面临一个问题。如果任何网络呼叫失败,则在下一个网络呼叫之间将不会进行,并且执行将停止。无论成功或失败,如何确保列表中的所有网络调用都已执行?

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的列表,其中包含成功或失败的结果。

1 个答案:

答案 0 :(得分:1)

Exception是rxjava中的terminal event,它会终止发生它的流(如果不使用任何运算符来处理它,则终止任何外部流)。但是,如果将该流包装在内部流中并应用运算符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