RxJava 錯誤處理

Rx中, 很容易處理異常, 整個鏈?zhǔn)秸{(diào)用過程中,如果異常不做處理, 最后都會交給onError;

不要過渡的依賴onError; onError應(yīng)該是在數(shù)據(jù)實在是無法處理的情況下,才被調(diào)用; 因為onError一旦被調(diào)用, 即意味著整個事件流結(jié)束;

在傳統(tǒng)的Java中, 一般產(chǎn)生異常, 可以自己決定處理或者拋出, 在Rx中也類似, 可以自己決定在產(chǎn)生異常后, 如何處理;

Catch

和傳統(tǒng)Java中Catch類似, 獲取異常,然后自行決定如何處理;

onErrorReturn

onErrorReturn操作符作用: 當(dāng)發(fā)生錯誤是, 發(fā)送一個默認(rèn)值,然后結(jié)束數(shù)據(jù)流(即調(diào)用onComplete); 使用后,Subscribe的onError方法不會被調(diào)用,會正常的調(diào)用onComplete結(jié)束;

onErrorReturn.png
onErrorResumeNext

onErrorResumeNext操作符的作用: 當(dāng)錯誤發(fā)生時, 用一個數(shù)據(jù)流代替當(dāng)前數(shù)據(jù)流, 繼續(xù)發(fā)送數(shù)據(jù); 和上面一樣,Subscribe的onError方法不會被調(diào)用

onErrorResumeNext.png
onExceptionResumeNext

onExceptionResumeNext類似, 唯一的區(qū)別就是onExceptionResumeNext捕獲的是異常

如果拋出的Throwable不是一個Exception, 該操作符無法捕獲

Retry

如果發(fā)生了異常, 也可以使用retry重新訂閱; 使用retry重新訂閱數(shù)據(jù)流后, Observable會從頭重新發(fā)射數(shù)據(jù), 意味著可能會重復(fù)處理數(shù)據(jù)

retry.png

retry有三個重載方法

  • retry 無限重新訂閱
  • retry(long) 帶有最大重試次數(shù), 次數(shù)超過,則不再重試
  • retry(Func) 帶有一個判讀函數(shù), 如果返回true, 則重試; 返回false,則結(jié)束
retryWhen

retryWhenretry類似, 不過接受一個函數(shù), 該函數(shù)返回一個Observable, 由Observable發(fā)射的數(shù)據(jù), 決定是否需要重新訂閱

  • 如果返回的Observable發(fā)射一個數(shù)據(jù), 則重新訂閱
  • 如果返回的Observable發(fā)射一個錯誤, 則不會重試

返回的Observable發(fā)射的數(shù)據(jù)類型不重要; Observable只是用來判斷是否需要重試

不結(jié)束當(dāng)前數(shù)據(jù)流, 捕獲(處理,忽略)異常

在平常編碼中, 處理一序列的數(shù)據(jù), 通常對其中的一個數(shù)據(jù)處理異常時, 我們通常會捕獲忽略異常, 跳過該數(shù)據(jù), 繼續(xù)處理剩下的數(shù)據(jù);

上述的操作符中, 上面的操作符并不能實現(xiàn)該功能; onErrorReturn遇到異常時,會結(jié)束該數(shù)據(jù)留, 不會處理剩下的數(shù)據(jù); 而retry會從頭重新發(fā)射數(shù)據(jù), 有重復(fù)數(shù)據(jù);
這種情況需要和flatMap一起搭配使用; flatMap可以把每項數(shù)據(jù)轉(zhuǎn)換成為一個Observable, 然后就可以針對每個數(shù)據(jù)處理異常了

Random random = new Random();
Observable<Integer> observable =
        Observable.create(o -> {
            o.onNext(random.nextInt());
            o.onNext(random.nextInt());
            o.onError(new Exception());
            o.onNext(random.nextInt());
        }).flatMap(o -> Observable.just(o)
                .map(Object::toString)
                .map(Integer::valueOf)
                .onErrorReturn(throwable -> -1)
        );
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妆兑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漆撞,更是在濱河造成了極大的恐慌书在,老刑警劉巖侥啤,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡超营,警方通過查閱死者的電腦和手機(jī)眠砾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門虏劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褒颈,你說我怎么就攤上這事柒巫。” “怎么了谷丸?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵堡掏,是天一觀的道長。 經(jīng)常有香客問我刨疼,道長布疼,這世上最難降的妖魔是什么摊趾? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮游两,結(jié)果婚禮上砾层,老公的妹妹穿的比我還像新娘。我一直安慰自己贱案,他們只是感情好肛炮,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宝踪,像睡著了一般侨糟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘩燥,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天秕重,我揣著相機(jī)與錄音,去河邊找鬼厉膀。 笑死溶耘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的服鹅。 我是一名探鬼主播凳兵,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼企软!你這毒婦竟也來了庐扫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仗哨,失蹤者是張志新(化名)和其女友劉穎形庭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厌漂,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡萨醒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桩卵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片验靡。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雏节,靈堂內(nèi)的尸體忽然破棺而出胜嗓,到底是詐尸還是另有隱情,我是刑警寧澤钩乍,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布辞州,位于F島的核電站,受9級特大地震影響寥粹,放射性物質(zhì)發(fā)生泄漏变过。R本人自食惡果不足惜埃元,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媚狰。 院中可真熱鬧岛杀,春花似錦、人聲如沸崭孤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辨宠。三九已至遗锣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗤形,已是汗流浹背精偿。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赋兵,地道東北人笔咽。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像毡惜,于是被迫代替她去往敵國和親拓轻。 傳聞我的和親對象是個殘疾皇子斯撮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位经伙,與響應(yīng)式編程作為結(jié)合使用的,對什么是操作勿锅、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,863評論 0 10
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符帕膜。對于擴(kuò)展包,由于使用率較低溢十,如有需求垮刹,請讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 45,677評論 8 93
  • 注:只包含標(biāo)準(zhǔn)包中的操作符张弛,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 937評論 0 3
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過調(diào)用觀察者的方法從頭創(chuàng)建一個ObservableEm...
    rkua閱讀 1,829評論 0 1
  • 參考:給 Android 開發(fā)者的 RxJava 詳解-扔物線深入淺出RxJava 基礎(chǔ) "a library f...
    Vincen1024閱讀 544評論 0 1