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。這代表着你的ObservableSubscriber之間的聯繫:

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方法將終止當前正在運行的代碼。無需額外的操作。

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