隨着越來越多的人開始提及 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.
關注微信公眾號獲得更多內容: