2017-01-25 3 views
4

При выполнении следующих действий в RxJava1, исключение в onNext будет перенаправлен в OnError одного и того же абонента:RxJava1 против Rxjava2: Исключение в 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? Или это не было сознательным изменением в первую очередь, так как я не могу найти никаких подробностей об этом?

пс. Я заметил, что обертывание этого в «SafeObserver» повторно перенаправляется на onError снова

ответ

4

Неправильно, две версии имеют разные конструктивные ограничения. В 2.x Observer/Subscriber не может выбрасывать из своих методов onXXX.

Если вы используете аргумент 1-2-3 subscribe() методов в 2.x, вы закрыты. В противном случае, если вы действительно не можете исправить свой onNext, используйте safeSubscribe().