在RxJava1中执行以下操作时,onNext中的异常将重新路由到同一订户的onError中:
Observable.from(Arrays.asList("1", "22", "333", "4444")).subscribe(new Subscriber() { @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() { @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
我最想知道的是,两个版本中的哪个版本做的“错误”?这是已修复的RxJava1中的错误吗?这是RxJava2中的错误吗?还是因为我找不到关于此的任何详细信息,这首先不是一个有意识的改变吗?
ps。我确实注意到,将其包装到“ SafeObserver”后会再次重新路由到onError
两者都没错,这两个版本具有不同的设计约束。在2.x中,Observer
/ Subscriber
不能从其onXXX
方法中抛出。
如果您subscribe()
在2.x中使用1-2-3自变量方法,则会被覆盖。否则,如果您真的无法解决onNext
使用问题safeSubscribe()
。