RxJava 詳解——簡潔的非同步作業(一)

來源:互聯網
上載者:User

標籤:gac   log   hub   依次   就會   開始   padding   adl   一個隊列   

隨著越來越多的人開始提及 RxJava ,鑒於 RxJava 目前這種既火爆又神秘的現狀,寫下這篇文章來對 RxJava 做一個相對詳細的、針對 Android 開發人員的介紹。

 

這篇文章的目的有兩個: 1. 給對 RxJava 感興趣的人一些入門的指引 2. 給正在使用 RxJava 但仍然心存疑惑的人一些更深入的解析。

 

在本文開始之前,放上 GitHub 連結和引入依賴的 gradle 代碼: Github: 
https://github.com/ReactiveX/RxJava 
https://github.com/ReactiveX/RxAndroid 
引入依賴: 
compile ‘io.reactivex:rxjava:1.0.14‘ 
compile ‘io.reactivex:rxandroid:1.0.1‘ 

 

 

RxJava 到底是什麼

一個詞:非同步。

RxJava 在 GitHub 首頁上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個在 Java VM 上使用可觀測的序列來組成非同步、基於事件的程式的庫)。這就是 RxJava ,概括得非常精準。

然而,對於初學者來說,這太難看懂了。因為它是一個『總結』,而初學者更需要一個『引言』。

其實, RxJava 的本質可以壓縮為非同步這一個詞。說到根上,它就是一個實現非同步作業的庫,而別的定語都是基於這之上的。

RxJava 好在哪

換句話說,『同樣是做非同步,為什麼人們用它,而不用現成的 AsyncTask / Handler / XXX / ... ?』

一個詞:簡潔。

非同步作業很關鍵的一點是程式的簡潔性,因為在調度過程比較複雜的情況下,非同步代碼經常會既難寫也難被讀懂。 Android 創造的 AsyncTask 和Handler ,其實都是為了讓非同步代碼更加簡潔。RxJava 的優勢也是簡潔,但它的簡潔的與眾不同之處在於,隨著程式邏輯變得越來越複雜,它依然能夠保持簡潔。

API 介紹和原理簡析1. 概念:擴充的觀察者模式

RxJava 的非同步實現,是通過一種擴充的觀察者模式來實現的。

RxJava 的觀察者模式

RxJava 有四個基本概念:Observable (可觀察者,即被觀察者)、 Observer (觀察者)、 subscribe (訂閱)、事件。Observable 和 Observer 通過 subscribe() 方法實現訂閱關係,從而 Observable 可以在需要的時候發出事件來通知 Observer。

與傳統觀察者模式不同, RxJava 的事件回調方法除了普通事件 onNext() (相當於 onClick() / onEvent())之外,還定義了兩個特殊的事件:onCompleted() 和 onError()。

  • onCompleted(): 事件隊列完結。RxJava 不僅把每個事件單獨處理,還會把它們看做一個隊列。RxJava 規定,當不會再有新的 onNext() 發出時,需要觸發 onCompleted() 方法作為標誌。

  • onError(): 事件隊列異常。在事件處理過程中出異常時,onError() 會被觸發,同時隊列自動終止,不允許再有事件發出。

  • 在一個正確啟動並執行事件序列中, onCompleted() 和 onError() 有且只有一個,並且是事件序列中的最後一個。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在隊列中調用了其中一個,就不應該再調用另一個。

2. 基本實現

基於以上的概念, RxJava 的基本實現主要有三點:

1) 建立 Observer

Observer 即觀察者,它決定事件觸發的時候將有怎樣的行為。 RxJava 中的 Observer 介面的實現方式:


除了 Observer 介面之外,RxJava 還內建了一個實現了 Observer 的抽象類別:Subscriber。 Subscriber 對 Observer 介面進行了一些擴充,但他們的基本使用方式是完全一樣的:

 

2) 建立 Observable

Observable 即被觀察者,它決定什麼時候觸發事件以及觸發怎樣的事件。 RxJava 使用 create() 方法來建立一個 Observable ,並為它定義事件觸發規則:

可以看到,這裡傳入了一個 OnSubscribe 對象作為參數。OnSubscribe 會被儲存在返回的 Observable 對象中,它的作用相當於一個計劃表,當 Observable 被訂閱的時候,OnSubscribe 的 call() 方法會自動被調用,事件序列就會依照設定依次觸發(對於上面的代碼,就是觀察者Subscriber 將會被調用三次 onNext() 和一次 onCompleted())。這樣,由被觀察者調用了觀察者的回調方法,就實現了由被觀察者向觀察者的事件傳遞,即觀察者模式。

3) Subscribe (訂閱)

除了 subscribe(Observer) 和 subscribe(Subscriber) ,subscribe() 還支援不完整定義的回調,RxJava 會自動根據定義建立出 Subscriber 。形式如下:

簡單解釋一下這段代碼中出現的 Action1 和 Action0。 Action0 是 RxJava 的一個介面,它只有一個方法 call(),這個方法是無參無傳回值的;由於 onCompleted() 方法也是無參無傳回值的,因此 Action0 可以被當成一個封裝對象,將 onCompleted() 的內容打包起來將自己作為一個參數傳入 subscribe() 以實現不完整定義的回調。這樣其實也可以看做將 onCompleted() 方法作為參數傳進了 subscribe(),相當於其他某些語言中的『閉包』。 Action1 也是一個介面,它同樣只有一個方法 call(T param),這個方法也無傳回值,但有一個參數;與 Action0 同理,由於 onNext(T obj) 和 onError(Throwable error) 也是單參數無傳回值的,因此 Action1 可以將 onNext(obj) 和 onError(error) 打包起來傳入 subscribe() 以實現不完整定義的回調。事實上,雖然 Action0 和 Action1 在 API 中使用最廣泛,但 RxJava 是提供了多個 ActionX 形式的介面 (例如 Action2, Action3) 的,它們可以被用以封裝不同的無傳回值的方法。

 

4) 情境樣本

下面舉兩個例子

1.

2.

 

關注公眾號獲得更多內容:

                                                            

 

RxJava 詳解——簡潔的非同步作業(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.