深入淺出RxJava(三)--響應式的好處
在第一篇中,我介紹了RxJava的基礎知識。第二篇中,我向你展示了操作符的強大。但是你可能仍然沒被說服。這篇裡面,我講向你展示RxJava的其他的一些好處,相信這篇足夠讓你去使用Rxjava.
錯誤處理
到目前為止,我們都沒怎麼介紹onComplete()和onError()函式。這兩個函式用來通知訂閱者,被觀察的物件將停止傳送資料以及為什麼停止(成功的完成或者出錯了)。
下面的程式碼展示了怎麼使用這兩個函式:
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!”或者”Ouch!”。
這種模式有以下幾個優點:
1.只要有異常發生onError()一定會被呼叫
這極大的簡化了錯誤處理。只需要在一個地方處理錯誤即可以。
2.操作符不需要處理異常
將異常處理交給訂閱者來做,Observerable的操作符呼叫鏈中一旦有一個丟擲了異常,就會直接執行onError()方法。
3.你能夠知道什麼時候訂閱者已經接收了全部的資料。
知道什麼時候任務結束能夠幫助簡化程式碼的流程。(雖然有可能Observable物件永遠不會結束)
我覺得這種錯誤處理方式比傳統的錯誤處理更簡單。傳統的錯誤處理中,通常是在每個回撥中處理錯誤。這不僅導致了重複的程式碼,並且意味著每個回撥都必須知道如何處理錯誤,你的回撥程式碼將和呼叫者緊耦合在一起。
使用RxJava,Observable物件根本不需要知道如何處理錯誤!操作符也不需要處理錯誤狀態-一旦發生錯誤,就會跳過當前和後續的操作符。所有的錯誤處理都交給訂閱者來做。
排程器
假設你編寫的Android app需要從網路請求資料(感覺這是必備的了,還有單機麼?)。網路請求需要花費較長的時間,因此你打算在另外一個執行緒中載入資料。那麼問題來了!
編寫多執行緒的Android應用程式是很難的,因為你必須確保程式碼在正確的執行緒中執行,否則的話可能會導致app崩潰。最常見的就是在非主執行緒更新UI。
使用RxJava,你可以使用subscribeOn()指定觀察者程式碼執行的執行緒,使用observerOn()指定訂閱者執行的執行緒:
myObservableServices.retrieveImage(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> myImageView.setImageBitmap(bitmap));
是不是很簡單?任何在我的Subscriber前面執行的程式碼都是在I/O執行緒中執行。最後,操作view的程式碼在主執行緒中執行.
最棒的是我可以把subscribeOn()和observerOn()新增到任何Observable物件上。這兩個也是操作符!。我不需要關心Observable物件以及它上面有哪些操作符。僅僅運用這兩個操作符就可以實現在不同的執行緒中排程。
如果使用AsyncTask或者其他類似的,我將不得不仔細設計我的程式碼,找出需要併發執行的部分。使用RxJava,我可以保持程式碼不變,僅僅在需要併發的時候呼叫這兩個操作符就可以。
訂閱(Subscriptions)
當呼叫Observable.subscribe(),會返回一個Subscription物件。這個物件代表了被觀察者和訂閱者之間的聯絡。
ubscription subscription = Observable.just("Hello, World!")
.subscribe(s -> System.out.println(s));
你可以在後面使用這個Subscription物件來操作被觀察者和訂閱者之間的聯絡.
subscription.unsubscribe();
System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
// Outputs "Unsubscribed=true"
RxJava的另外一個好處就是它處理unsubscribing的時候,會停止整個呼叫鏈。如果你使用了一串很複雜的操作符,呼叫unsubscribe將會在他當前執行的地方終止。不需要做任何額外的工作!
總結
記住這個系列僅僅是對RxJava的一個入門介紹。RxJava中有更多的我沒介紹的功能等你探索(比如backpressure)。當然我也不是所有的程式碼都使用響應式的方式–僅僅當程式碼複雜到我想將它分解成簡單的邏輯的時候,我才使用響應式程式碼。
最初,我的計劃是這篇文章作為這個系列的總結,但是我收到許多請求我介紹在Android中使用RxJava,所以你可以繼續閱讀第四篇了。我希望這個介紹能讓你開始使用RxJava。如果你想學到更多,我建議你閱讀RxJava的官方wiki。
相關文章
- 深入淺出RxJava(3):響應式的好處RxJava
- 深入淺出RxJava(四)-在Android中使用響應式程式設計RxJavaAndroid程式設計
- 深入淺出RxJava(4):在Android中使用響應式程式設計RxJavaAndroid程式設計
- 深入淺出Vue響應式原理(完整版)Vue
- 深入淺出基於“依賴收集”的響應式原理
- 深入淺出RxJava(一:基礎篇)RxJava
- 深入淺出RxJava(2):操作符RxJava
- 深入淺出RxJava(1):基礎篇RxJava
- 深入淺出RxJava(二:操作符)RxJava
- 你也許不知道的Vuejs – 深入淺出響應式系統VueJS
- 你也許不知道的Vuejs - 深入淺出響應式系統VueJS
- RxJava+Retrofit+OkHttp深入淺出-mvp(使用篇)RxJavaHTTPMVP
- 響應式程式設計RxJava (一)程式設計RxJava
- RxJava+Retrofit+OkHttp深入淺出-終極封裝七(異常處理)RxJavaHTTP封裝
- RxJava+Retrofit+OkHttp深入淺出-終極封裝三(檔案上傳)RxJavaHTTP封裝
- 響應式程式設計入門(RxJava)程式設計RxJava
- 響應式程式設計庫RxJava初探程式設計RxJava
- RxJava+Retrofit+OkHttp 深入淺出-終極封裝一RxJavaHTTP封裝
- Tomcat深入淺出——Servlet(三)TomcatServlet
- PostgreSQL VACUUM 之深入淺出 (三)SQL
- 深入淺出UML類圖(三)
- 深入解析vue響應式原理Vue
- 淺究Vue響應式原理Vue
- 深入淺出FE(十四)深入淺出websocketWeb
- 【深入淺出ES6】函式函式
- 深入淺出之正規表示式
- 解釋Vue深入響應式原理Vue
- [譯] 響應式 Web 應用(三)Web
- 反射的深入淺出反射
- 深入淺出this的理解
- 得物技術淺談深入淺出的Redis分散式鎖Redis分散式
- 深入淺出之正規表示式(二)
- 深入淺出之正規表示式(一)
- Vue 原始碼解析:深入響應式原理Vue原始碼
- 淺談前端響應式設計(一)前端
- Vue響應式原理原始碼淺析Vue原始碼
- 淺談前端響應式設計(二)前端
- 響應式架構與 RxJava 在有贊零售的實踐架構RxJava