java - 单个观察者没有调用 onError()

标签 java android observable rx-java2

我在 Android 应用程序的 MainActivity 中编写了以下代码。当我运行以下代码时,它不会抛出任何异常并且 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();
                    }
                });

最佳答案

您正在 NULL 字符串上调用 s.isEmpty(),这就是它在第一次打印时结束的原因。那就是说 onSuccess() 不会抛出任何东西,所以当 NullPointerException 被抛出时它只是停止执行(它在 RxJava 中为你静默处理)。一旦你订阅了 observable,你就会在 onSuccess() 中获得初始值,然后如果它发生变化或者你重新订阅你会在 onSuccess() 中获得另一个值,这就是为什么被调用两次。因为 onError() 是针对操作链中发生的错误,所以当异常被抛出时,您不会在 onSuccess() 中得到错误。


这种行为是故意的。根据 Rx Contract,观察者不应同时收到 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();
                }
            });

祝你好运:)

关于java - 单个观察者没有调用 onError(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54423244/

相关文章:

使用 ConcurrentHashMap 和同步块(synchronized block)实现 Java 并发

java - 错误 400 : Request[/editRecordsAction] does not contain handler parameter named

android - 在 Android 上使用 react-native 的简单登录屏幕

rxjs - 如何使用 ReactiveX Observables/Subjects 处理进度更新?

javascript - 可观察对象的条件合并

javascript - 如何在knockoutjs中获取ko.compulated或ko.observable底层函数?

java - 在带有 Glassfish 4 的 Netbeans 8 中包含用于 ResourceConfig 的 Jersey

c# - 如何在 Java 中编写泛型方法

android - 无法更新 multidex 行为

java - TabLayout改变tabText颜色