2017-01-25 91 views
4

当在做RxJava1以下,在onNext异常将被重新路由到同一个用户的的onError:RxJava1 VS 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中的一个错误吗? 或者有没有在第一个地方有意识的改变,因为我找不到任何细节呢?

ps。我确实注意到,将此包装到'SafeObserver'中再次重新路由到onError

回答

4

两个版本都有不同的设计约束。在2.x中,Observer/Subscriber不能从其onXXX方法中抛出。

如果在2.x中使用1-2-3自变量subscribe()方法,则会被覆盖。否则,如果你真的不能修复你的onNext使用safeSubscribe()