1. 程式人生 > >Rxjava(3.響應式程式設計好處)

Rxjava(3.響應式程式設計好處)

參考地址

本文主要分為:

1.錯誤處理

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.Rxjava在處理unsubscribing的時候,會停止整個呼叫鏈
………如果你使用了一串很複雜的操作符,呼叫unsubscribe將會在他當前執行的地方終止。不需要做任何額外的工作!

注意:


使用RxJava,Observable物件根本不需要知道如何處理錯誤!操作符也不需要處理錯誤狀態-一旦發生錯誤,就會跳過當前和後續的操作符。所有的錯誤處理都交給訂閱者來做。

2.排程器

  • 使用排程器的起因

假設你編寫的Android app需要從網路請求資料(感覺這是必備的了,還有單機麼?)。網路請求需要花費較長的時間,因此你打算在另外一個執行緒中載入資料。那麼問題來了!

編寫多執行緒的Android應用程式是很難的,因為你必須確保程式碼在正確的執行緒中執行,否則的話可能會導致app崩潰。最常見的就是在非主執行緒更新UI。

使用RxJava,你可以使用subscribeOn()指定觀察者程式碼執行的執行緒,使用observerOn()指定訂閱者執行的執行緒:

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

注意:
任何在我的subscribe前面執行的程式碼都是在I/O執行緒中執行。最後,操作view的程式碼在主執行緒中執行.

最棒的是我可以把subscribeOn()和observerOn()新增到任何Observable物件上。這兩個也是操作符!。我不需要關心Observable物件以及它上面有哪些操作符。僅僅運用這兩個操作符就可以實現在不同的執行緒中排程。

如果使用AsyncTask或者其他類似的,我將不得不仔細設計我的程式碼,找出需要併發執行的部分。使用RxJava,我可以保持程式碼不變,僅僅在需要併發的時候呼叫這兩個操作符就可以。

3.訂閱(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將會在他當前執行的地方終止。不需要做任何額外的工作!

回到頂部