RxJava1 与 Rxjava2:onNext 中的异常
RxJava1 vs Rxjava2: Exception in onNext
在 RxJava1 中执行以下操作时,onNext 中的异常将被重新路由到同一个订阅者的 onError:
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 中做同样的事情时,这种行为已经改变,不再 returns 到 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
我最想知道的是,这两个版本中的哪一个正在执行此操作 "wrong"?
这是已修复的 RxJava1 中的错误吗?这是 RxJava2 中的错误吗?
还是一开始这不是有意识的改变,因为我找不到任何相关细节?
ps。我确实注意到将其包装到 'SafeObserver' 中会再次重新路由到 onError
都没有错,两个版本的设计约束不同。在 2.x 中,Observer
/Subscriber
无法从其 onXXX
方法中抛出。
如果您使用 2.x 中的 1-2-3 参数 subscribe()
方法,您将被覆盖。否则,如果您真的无法修复 onNext
,请使用 safeSubscribe()
.
在 RxJava1 中执行以下操作时,onNext 中的异常将被重新路由到同一个订阅者的 onError:
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 中做同样的事情时,这种行为已经改变,不再 returns 到 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
我最想知道的是,这两个版本中的哪一个正在执行此操作 "wrong"? 这是已修复的 RxJava1 中的错误吗?这是 RxJava2 中的错误吗? 还是一开始这不是有意识的改变,因为我找不到任何相关细节?
ps。我确实注意到将其包装到 'SafeObserver' 中会再次重新路由到 onError
都没有错,两个版本的设计约束不同。在 2.x 中,Observer
/Subscriber
无法从其 onXXX
方法中抛出。
如果您使用 2.x 中的 1-2-3 参数 subscribe()
方法,您将被覆盖。否则,如果您真的无法修复 onNext
,请使用 safeSubscribe()
.