onErrorResumeNext的rxjava行为

时间:2016-11-29 17:21:43

标签: android rx-java system.reactive

我无法让Observer.onErrorResumeNext按照我的预期行事。

Subscriber orchestratorObserver = new Subscriber<Integer>() {
    @Override
    public void onCompleted() {
        System.out.println("orchestratorObserver."+"onCompleted()");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("orchestratorObserver."+"onError()"+e.getMessage());
    }

    @Override
    public void onNext(Integer i) {
        System.out.println("orchestratorObserver."+"onNext() : "+i);
    }
};

@Test
public void rxTest() {
    Observable.range(0,5)
            .doOnNext(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    throw new RuntimeException("chain error!!");
                }
            })
            .onErrorResumeNext(Observable.just(-1))
            .subscribe(orchestratorObserver);
}

@Test
public void rxTest1() {

    final Observable<Integer> errorTrainObservable = Observable.defer(
            new Func0<Observable<Integer>>() {
                @Override
                public Observable<Integer> call() {
                    return Observable.error(new RuntimeException("source error"));
                }
            });

    errorTrainObservable.onErrorResumeNext(Observable.just(-1));

    errorTrainObservable.subscribe(orchestratorObserver);
}

所以rxTest()输出:

orchestratorObserver.onNext() : -1
orchestratorObserver.onCompleted()

而rxTest1()输出:

orchestratorObserver.onError()source error

我希望rxTest1输出与rxTest相同的onNext事件 - 我该怎么做?即我想吞下错误并在下一个事件上发出一个defualt值。

奇怪的是,如果错误发生在源头,它会表现出一种方式 - 但如果错误是链,那么它的表现方式是另一种方式?如果你可以向我解释,请加分:)

1 个答案:

答案 0 :(得分:5)

这些行:

errorTrainObservable.onErrorResumeNext(Observable.just(-1));

errorTrainObservable.subscribe(orchestratorObserver);

您使用错误处理程序创建Observable,然后将其丢弃,然后在没有错误处理程序的情况下订阅observable。