瞭解RxJava之響應式好處(三)

原文鏈接:Grokking RxJava, Part 3: Reactive with Benefits

第一部分中我瀏覽了RxJava的基本結構,並且介紹了map操作符。在第二部分中,我介紹了RxJava操作符的強大之處。不過你仍舊很固執,因爲這不足以打動你。接下來介紹RxJava其他的優勢。

0x00 錯誤處理

直到此時,我們還沒有介紹onComplete()和onError()。他們標誌着Observable停止發射事件的時機和原因(成功完成或者未知錯誤)。

我們的初始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. 操作符不需要處理異常
你可以把它交給Subscriber來決定如何處理異常,因爲異常的onError()。
3. 你知道Subscriber 何時停止接收事件
瞭解任務何時完成,有助於的代碼流程。(雖然一個Observable 可能永遠不會完成。)。

我覺得這種模式比傳統的錯誤處理更簡單。傳統方式是通過這個回調,你必須在每個回調中進行錯誤處理,這不但導致了重複的代碼,而且每個回調必須知道如何處理錯誤,意味着你回調與調用者緊耦合。

採用響應式模式,Observable甚至不知道如何處理錯誤。操作符不需要處理錯誤。把錯誤處理交給Subscriber吧。

0x02 調度器(Schedulers)

你有一個進行長時間網絡請求的App,所有你必須工作在其他線程中。不過,可以遇到點小麻煩!

多線程Android應用程序是困難的,因爲你必須確保代碼運行正確的線程;搞砸了,你的應用程序可能會崩潰。這裏典型的異常就是在主線程外修改視圖。

可以使用 subscribeOn() 和 observeOn() 兩個方法來對線程進行控制,subscribeOn允許我們在指定的線程創建數據,observeOn允許我們在指定的線程發射的數據。

myObservableServices.retrieveImage(url)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

這一切多麼簡單?一切都在發射到Subscriber之前運行在I/O線程。最後,在我的主線程操作視圖。

強大的是subscribeOn() 和 observeOn() 可以添加到任何Observable。我們不必擔心Observable或者前面的操作符做過什麼,我只需把他放在每個線程之後。

有點類似AsyncTask ,我必須仔細設計我的代碼,當它需要併發的時候。RxJava,保留相同的代碼,只是在併發的時候添加這些操作符。

0x03 訂閱(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());
// Outputs "Unsubscribed=true"

RxJava處理終止操作看起來多麼棒,如果你使用的複雜的鏈式操作,使用unsubscribe 終端執行,無需考慮其他工作。

0x04 結論

請記住,這些文章是RxJava導論。相比我提到的還有更多東西等着你(例如backpressure)。我也不是所有代碼都使用響應式,只要足夠複雜的代碼,我想分解爲簡單的邏輯。

最初,我計劃以這篇文章作爲這個系列的總結,但是有些要求在Android中使用RxJava的實例,所以就有了第四部分。我希望這個介紹能讓你開始使用RxJava。如果你想了解更多,我建議閱讀RxJava官方維基。記住:無限可能。

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