亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單個觀察者沒有調用 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 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號