2017-01-25 8 views
4

の例外RxJava1で次の操作を実行すると、onNextで例外が同じ加入者のonErrorに再ルーティングされることになります。RxJava1:onNext

Observable.from(Arrays.asList("1", "22", "333", "4444")).subscribe(new Subscriber<String>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 
      Log.d("RxJava1", "onError: " + e.getCause()); 
     } 

     @Override 
     public void onNext(String s) { 
      if (s.length() == 4) { 
       Integer test = null; 
       test.hashCode(); 
      } 
      Log.d("RxJava1", s + " - " + s.length()); 
     } 
    }); 

出力:

D/RxJava1: 1 - 1 
D/RxJava1: 22 - 2 
D/RxJava1: 333 - 3 
D/RxJava1: onError: null 

やっ私が知る限り、RxJava2で同じことが起こりました。この動作は変更されており、もはやonErrorに戻りませんが、単にクラッシュします。

Observable.fromIterable(Arrays.asList("1", "22", "333", "4444")).subscribeWith(new Observer<String>() { 
     @Override 
     public void onSubscribe(Disposable d) { 

     } 

     @Override 
     public void onNext(String s) { 
      if (s.length() == 4) { 
       Integer test = null; 
       test.hashCode(); 
      } 
      Log.d("RxJava2", s + " - " + s.length()); 
     } 

     @Override 
     public void onError(Throwable e) { 
      Log.d("RxJava2", "onError: " + e.getCause()); 
     } 

     @Override 
     public void onComplete() { 

     } 
    }); 

出力:私はほとんど知りたい

D/RxJava2: 1 - 1 
D/RxJava2: 22 - 2 
D/RxJava2: 333 - 3 
D/AndroidRuntime: Shutting down VM 

は、2つのバージョンのそれは「間違った」ことをしているのですか? RxJava1のバグは修正されましたか?これはRxJava2のバグですか? これについての詳細を見つけることができないので、これは最初の意識的な変化ではありませんでしたか?

ps。私はこれを 'SafeObserver'にラップして再びonErrorに再ルーティングすることに気付きました

答えて

4

どちらのバージョンも、異なるデザイン制約があります。 2.xではObserver/SubscriberonXXXメソッドから投げることはできません。

2.xで1,2-3引数subscribe()のメソッドを使用する場合は、対象となります。そうでない場合は、実際にonNextを修正できない場合はsafeSubscribe()を使用してください。

関連する問題