2016-11-29 3 views
0

Observer.onErrorResumeNextを期待通りに動作させるのに問題があります。rxjavaの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()出力:rxTest1しばらく

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

()出力:

orchestratorObserver.onError()source error 

私は出力にrxTestと同じonNextイベントをrxTest1をしたいと思います - 私はどのように行うことができますそれ?すなわち、私はエラーを飲み込んで、デフアル値onNextイベントを出したい。

エラーがソースにある場合、一方向に動作しますが、エラーがチェーンであれば別の方法で動作するのは奇妙に思えますか?余分なポイントは、あなたが私にそれを説明することができれば:)

答えて

4

これらの行:あなたはエラーハンドラでObservableを作成

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

errorTrainObservable.subscribe(orchestratorObserver); 

、あなたは、あなたがエラーハンドラなしで観測可能に加入し、それを捨てます。

+1

それは私のために馬鹿のバッジに値する... – siliconeagle

+2

私たちはすべてそこにいたことを心配しないでください... –