深入淺出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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章