文章轉載自: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)點:
-
只要有異常發(fā)生onError()一定會被調用
- 這極大的簡化了錯誤處理颅夺。只需要在一個地方處理錯誤即可以朋截。 -
操作符不需要處理異常
- 將異常處理交給訂閱者來做,Observerable的操作符調用鏈中一旦有一個拋出了異常吧黄,就會直接執(zhí)行onError()方法部服。 -
你能夠知道什么時候訂閱者已經接收了全部的數(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稚叹。