为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

函数式编程 2022-05-25 15:51:19
我在 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();                    }                });
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

您正在调用s.isEmpty()一个NULL字符串,这就是它在第一次打印时结束的原因。也就是说onSuccess()不会抛出任何东西,所以它只是在NullPointerException抛出时停止执行(它在 RxJava 中为你默默地处理)。一旦你订阅 observable,你就会得到 in 的初始值onSuccess(),然后如果它发生变化或者你重新订阅你会得到另一个值 in 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();

                }

            });

祝你好运 :)


查看完整回答
反对 回复 2022-05-25
?
互换的青春

TA贡献1797条经验 获得超6个赞

onError用于沿着操作员链发生的错误。你在里面做的onSuccess已经在结尾了,不会在onError.



查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信