理解RxJava:(三)RxJava的優點
在第一部分,講解了RxJava的基本結構。在第二部分,展示了operators的強大之處。但是你們可能仍然沒有被說服,也沒有足夠的理由信服。下面是一些能讓你信服的RxJava框架的優點。
錯誤處理
截至當前,我們一直都忽略onComplete()
和onError()
方法。它們標志着Observable
停止發出items以及原因(不管是成功地完成或是不可恢復的錯誤)。
我們最初的Subscriber
有能力監聽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()
都能拋出異常。每個Observable
都以調用onCompleted()``onError()
方法結束。正因為這樣, 程序的輸出要么是Completed!
,要么是Ouch!
(因為異常的拋出)
關於這個的補充:
-
1.
onError()
方法在有異常在任意時候被拋出的時候被調用。這使得錯誤處理變得更簡單。只需要在最后的時候在一個簡單的方法中處理所有的錯誤即可。
-
2.operators不需要處理異常。
在
Observable
鏈上拋出的任何異常都可以留給Subscriber
決定如何處理。因為onError()
方法之前的異常都會被跳過。
- 3.我們能知道
Subscriber
完成接收items的時候。
知道任務什么時候結束有助於代碼的流動。
在錯誤處理上, 這個模式要比傳統的錯誤處理簡單得多。使用回調,必須在每個回調中處理錯誤。不僅僅是造成重復代碼,也意味着每個回調都需要知道如何處理錯誤,意味着你的回調代碼和調用者高度耦合。
通過RxJava,Observable
不需要知道如何處理錯誤。operators不僅僅不需要處理錯誤狀態,在關鍵錯誤發生時,它們會自動跳過。我們可以把所有的錯誤處理交給Subscriber
。
調度者(Schedulers)
你有一個需要做網絡請求的Android應用。因為可能需要耗費很長時間,於是你在其它線程做網絡請求。一般都會遇到這樣的問題。
Android應用的多線程操作很難是因為你必須在正確的線程運行對的代碼。否則應用會閃退。經典的錯誤就是當你在非主線程修改View的狀態。
在RxJava中,我們能通過subscribeOn()
方法指定Observer
代碼運行的線程,以及observeOn()
方法指定Subscriber
運行的線程。
myObservableServices.retrieveImage(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> myImageView.setImageBitmap(bitmap));
多么簡單?我的Subscriber
之前的都運行在I/O線程。最后,View的操作發生在主線程。
最厲害的部分是我能綁定subcribeOn()
和observeOn()
方法到任意的Observable
上。
它們僅僅是operators。我不需要擔心Observable
和之前的operators在做什么。在最后僅僅操作這個就輕易的實現線程的切換。
訂閱(Subscriptions)
還有些東西沒有講解。當你調用Observable.subscribe()
,返回的是Subscription
。這代表着你的Observable
和Subscriber
之間的聯系:
Subscription subscription = Observable.just("Hello, World!")
.subscribe(s -> System.out.println(s));
可以使用Subscription
來斷絕這個聯系:
subscription.unsubscribe();
System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
// 輸出 "Unsubscribed=true"
RxJava取消訂閱的優點是它能停止方法鏈。如果你有一個復雜的operators鏈,調用unsubscribe
方法將終止當前正在運行的代碼。無需額外的操作。
結論
記住這幾篇都是RxJava的入門文章。你們要學的比我現在所講的要多得多。例如,研讀backpressure。我不會在所有地方都用響應式編程。而只會在我想要把復雜邏輯變得更簡單的地方使用。
最初,我計划這篇文章是這系列的最后一篇。但是一個常見的需求是RxJava在Android中的實際運用。因此,你能繼續閱讀第四部分。我希望這個入門系列能引導你們開始學習使用這個有趣的框架。如果你想要進一步學習,我建議閱讀RxJava的官方wiki。
#######本文翻譯自Grokking RxJava, Part 3: Reactive with Benefits,著作權歸原作者danlew所有。譯文由JohnTsai翻譯。轉載請注明出處,並保留此段聲明。