RxJava1 vs Rxjava2:onNext中的异常

时间:2017-01-25 11:00:36

标签: rx-java rx-java2

在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中的错误吗? 或者这首先不是有意识的改变,因为我找不到任何关于此的细节?

PS。我注意到将它包装到'SafeObserver'再次重新路由到onError

1 个答案:

答案 0 :(得分:4)

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

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