深入淺出RxJava三 - 響應式的好處 <譯>

文章轉載自:Hi大頭鬼_深入淺出RxJava三 - 響應式的好處
個人感覺CSDN上看起來字體不是很舒服,所以轉載一下辅愿。

英文原文
第一篇中智亮,我介紹了RxJava的基礎知識。第二篇中点待,我向你展示了操作符的強大阔蛉。但是你可能仍然沒被說服。這篇里面癞埠,我講向你展示RxJava的其他的一些好處状原,相信這篇足夠讓你去使用Rxjava.

錯誤處理


到目前為止,我們都沒怎么介紹onComplete()onError()函數(shù)苗踪。這兩個函數(shù)用來通知訂閱者颠区,被觀察的對象將停止發(fā)送數(shù)據(jù)以及為什么停止(成功的完成或者出錯了)。

下面的代碼展示了怎么使用這兩個函數(shù):

Observable.just("Hello, world!")
    .map(s -> potentialException(s))
    .map(s -> anotherPotentialException(s))
    .subscribe(new Subscriber<String>() {
        @Override
        public void onNext(String s) { System.out.println(s); }

        @Override
        public void onCompleted() { System.out.println("Completed!"); }

        @Override
        public void onError(Throwable e) { System.out.println("Ouch!"); }
    });

代碼中的potentialException()anotherPotentialException()有可能會拋出異常通铲。每一個Observerable對象在終結的時候都會調用onCompleted()或者onError()方法毕莱,所以Demo中會打印”Completed!”或者”O(jiān)uch!”。

這種模式有以下幾個優(yōu)點:

  1. 只要有異常發(fā)生onError()一定會被調用 - 這極大的簡化了錯誤處理颅夺。只需要在一個地方處理錯誤即可以朋截。
  2. 操作符不需要處理異常 - 將異常處理交給訂閱者來做,Observerable的操作符調用鏈中一旦有一個拋出了異常吧黄,就會直接執(zhí)行onError()方法部服。
  3. 你能夠知道什么時候訂閱者已經接收了全部的數(shù)據(jù) - 知道什么時候任務結束能夠幫助簡化代碼的流程。(雖然有可能Observable對象永遠不會結束)

我覺得這種錯誤處理方式比傳統(tǒng)的錯誤處理更簡單拗慨。傳統(tǒng)的錯誤處理中廓八,通常是在每個回調中處理錯誤。這不僅導致了重復的代碼胆描,并且意味著每個回調都必須知道如何處理錯誤瘫想,你的回調代碼將和調用者緊耦合在一起。

使用RxJava昌讲,Observable對象根本不需要知道如何處理錯誤!操作符也不需要處理錯誤狀態(tài)-一旦發(fā)生錯誤减噪,就會跳過當前和后續(xù)的操作符短绸。所有的錯誤處理都交給訂閱者來做。

調度器


假設你編寫的Android app需要從網絡請求數(shù)據(jù)(感覺這是必備的了筹裕,還有單機么醋闭?)。網絡請求需要花費較長的時間朝卒,因此你打算在另外一個線程中加載數(shù)據(jù)证逻。那么問題來了!

編寫多線程的Android應用程序是很難的抗斤,因為你必須確保代碼在正確的線程中運行囚企,否則的話可能會導致app崩潰丈咐。最常見的就是在非主線程更新UI。

使用RxJava龙宏,你可以使用subscribeOn()指定觀察者代碼運行的線程棵逊,使用observerOn()指定訂閱者運行的線程:

myObservableServices.retrieveImage(url)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

是不是很簡單?任何在我的Subscriber前面執(zhí)行的代碼都是在I/O線程中運行银酗。最后辆影,操作view的代碼在主線程中運行.

最棒的是我可以把subscribeOn()observerOn()添加到任何Observable對象上。這兩個也是操作符黍特!蛙讥。我不需要關心Observable對象以及它上面有哪些操作符。僅僅運用這兩個操作符就可以實現(xiàn)在不同的線程中調度灭衷。

如果使用AsyncTask或者其他類似的键菱,我將不得不仔細設計我的代碼,找出需要并發(fā)執(zhí)行的部分今布。使用RxJava经备,我可以保持代碼不變,僅僅在需要并發(fā)的時候調用這兩個操作符就可以部默。

訂閱(Subscriptions)


當調用Observable.subscribe()侵蒙,會返回一個Subscription對象。這個對象代表了被觀察者和訂閱者之間的聯(lián)系傅蹂。

ubscription subscription = Observable.just("Hello, World!")
    .subscribe(s -> System.out.println(s));

你可以在后面使用這個Subscription對象來操作被觀察者和訂閱者之間的聯(lián)系.

subscription.unsubscribe();
System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
// Outputs "Unsubscribed=true"

RxJava的另外一個好處就是它處理unsubscribing的時候纷闺,會停止整個調用鏈。如果你使用了一串很復雜的操作符份蝴,調用unsubscribe將會在他當前執(zhí)行的地方終止犁功。不需要做任何額外的工作!

總結


記住這個系列僅僅是對RxJava的一個入門介紹婚夫。RxJava中有更多的我沒介紹的功能等你探索(比如backpressure)浸卦。當然我也不是所有的代碼都使用響應式的方式–僅僅當代碼復雜到我想將它分解成簡單的邏輯的時候,我才使用響應式代碼案糙。

最初限嫌,我的計劃是這篇文章作為這個系列的總結,但是我收到許多請求我介紹在Android中使用RxJava时捌,所以你可以繼續(xù)閱讀第四篇了怒医。我希望這個介紹能讓你開始使用RxJava。如果你想學到更多奢讨,我建議你閱讀RxJava的官方wiki稚叹。

繼續(xù)下一篇

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扒袖,更是在濱河造成了極大的恐慌塞茅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僚稿,死亡現(xiàn)場離奇詭異凡桥,居然都是意外死亡,警方通過查閱死者的電腦和手機蚀同,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門缅刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠢络,你說我怎么就攤上這事衰猛。” “怎么了刹孔?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵啡省,是天一觀的道長。 經常有香客問我髓霞,道長卦睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任方库,我火速辦了婚禮结序,結果婚禮上,老公的妹妹穿的比我還像新娘纵潦。我一直安慰自己徐鹤,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布邀层。 她就那樣靜靜地躺著返敬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寥院。 梳的紋絲不亂的頭發(fā)上劲赠,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音只磷,去河邊找鬼经磅。 笑死,一個胖子當著我的面吹牛钮追,可吹牛的內容都是我干的。 我是一名探鬼主播阿迈,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼元媚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起刊棕,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤炭晒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甥角,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體网严,經...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年嗤无,在試婚紗的時候發(fā)現(xiàn)自己被綠了震束。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡当犯,死狀恐怖垢村,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嚎卫,我是刑警寧澤嘉栓,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站拓诸,受9級特大地震影響侵佃,放射性物質發(fā)生泄漏。R本人自食惡果不足惜奠支,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一馋辈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胚宦,春花似錦首有、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至您旁,卻和暖如春烙常,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹤盒。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工蚕脏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侦锯。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓驼鞭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尺碰。 傳聞我的和親對象是個殘疾皇子挣棕,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容