5

在 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 中这样做时,这种行为已经改变,不再返回 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

我主要想知道,这两个版本中的哪个“错误”?这是已修复的 RxJava1 中的错误吗?这是 RxJava2 中的错误吗?或者这不是一个有意识的改变,因为我找不到任何细节?

附言。我确实注意到将其包装到“SafeObserver”中会再次重新路由到 onError

4

1 回答 1

5

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

如果您subscribe()在 2.x 中使用 1-2-3 参数方法,您将被覆盖。否则如果你真的无法修复你的onNext使用safeSubscribe()

于 2017-01-25T11:11:23.443 回答