Один наблюдатель не вызывает onError () - PullRequest
0 голосов
/ 29 января 2019

Я написал следующий код в моей MainActivity приложения для Android.Когда я запускаю следующий код, он не выдает никаких исключений, и onError () также не вызывается.Однако я вижу onSuccess: testing starts дважды , но не вижу onSuccess: testing ends.Почему не вызывается onError () и / или почему приложение не падает?

Single.timer(1000, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.computation())
                .subscribeWith(new DisposableSingleObserver<Long>() {
                    @Override
                    public void onSuccess(Long initiationTimeStamp) {
                        String s = null;
                        Log.d(TAG, "onSuccess: testing starts");
                        Log.d(TAG, "onSuccess:test  "+ s.isEmpty());
                        Log.d(TAG, "onSuccess: testing ends");
                    }

                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                    }
                });

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы звоните s.isEmpty() на NULL строку, поэтому она заканчивается при первом выводе на печать.Тем не менее, onSuccess() ничего не выбрасывает, поэтому он просто останавливает выполнение, когда выбрасывается NullPointerException (он для вас молча обрабатывается внутри RxJava).Как только вы подписываетесь на observable, вы получаете начальное значение в onSuccess(), затем, если оно изменяется или вы подписываетесь повторно, вы получаете другое значение в onSuccess(), поэтому оно вызывается дважды .А поскольку onError() относится к ошибкам, возникающим в цепочке операций, вы не получите ошибку в onSuccess() при возникновении исключения.

Такое поведение является преднамеренным.Согласно договору Rx, наблюдатель не должен получать и onSuccess(), и onError().Вам нужно обработать исключение в onSuccess() самостоятельно.

Например:

Single.timer(1000, TimeUnit.MILLISECONDS)
            .subscribeOn(Schedulers.computation())
            .subscribeWith(new DisposableSingleObserver<Long>() {
                @Override
                public void onSuccess(Long initiationTimeStamp) {
                    try {
                        String s = null;
                        Log.d(TAG, "onSuccess: testing starts");
                        Log.d(TAG, "onSuccess:test  "+ s.isEmpty());
                        Log.d(TAG, "onSuccess: testing ends");
                    }
                    catch (Throwable ex) {
                        // tell the upstream we can't accept any more data (OPTIONAL)
                        dispose();
                        // pass error to error handler
                        onError(ex);
                    }
                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }
            });

Удачи:)

0 голосов
/ 29 января 2019

onError для ошибок, которые происходят вдоль цепочки операторов.То, что вы делаете в onSuccess, уже в конце, и не будет сообщено в onError.

...