前面講了RxJava2.x的使用,接下來這篇講一下RxJava+Retrofit發(fā)送網絡請求。
Android中有多種網絡請求庫, Retrofit便是其中的佼佼者,它的優(yōu)勢之一便是它支持RxJava的方式來調用。我們便以Retrofit進行網絡請求,RxJava進行異步處理,兩者結合來講解RxJava在網絡請求中的具體使用。
本例中 我們使用淘寶IP地址庫,獲取ip的詳細信息(沒找可以直接使用的天氣查詢接口,還得注冊太麻煩了)。
接口url:http://ip.taobao.com/service/getIpInfo.php?ip=202.202.32.202
具體請求的返回數據形式如下:

下面以上述數據簡單講解一下Retrofit的基本用法。
要使用Retrofit,先在Gradle中添加配置:
compile'io.reactivex.rxjava2:rxjava:2.0.6'
compile'io.reactivex.rxjava2:rxandroid:2.0.1'
compile'com.squareup.retrofit2:retrofit:2.2.0'
compile'com.squareup.retrofit2:converter-gson:2.1.0'
compile'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
定義Api接口:
public interfaceApi {
@GET("getIpInfo.php") ObservablegetIPInfo(@Query("ip") String ip);
}
創(chuàng)建一個Retrofit?


接下來就可以進行網絡請求:
03-06 15:46:40.062 26977-26977/com.android.rxjavademo E/RxJava2.x: 中國,重慶市
調用Api接口方法,返回一個Observable(被觀察者)對象,然后當subscribe()訂閱后,就可以在IO線程中執(zhí)行網絡 請求操作,最終Observer(觀察者)對象在UI線程中獲得ip詳細信息。
其中請求返回的數據是json形式,IP類包含所有的返回數據,具體代碼如下:


以上僅僅以實例介紹RxJava的基礎使用,RxJava的功能遠不止于此。不過掌握了以上的技能,我們已經可以在我們的項目中應用RxJava進行異步操作了。關于一些RxJava中的細節(jié)及其他相關技術還需要慢慢積累。
Disposable簡介及使用
下面我們另一個重要的概念Disposable。當Observer(觀察者)與Observable(被觀察者)通過subscribe()建立連接后,事件可以進行傳遞。當發(fā)生一些其他情況,不得不斷開兩者之間的連接時,該怎么操作?這個時候就該Disposable上場了。
Disposable簡介
Disposable在RxJava中,用它來切斷Observer(觀察者)與Observable(被觀察者)之間的連接,當調用它的dispose()方法時, 它就會將Observer(觀察者)與Observable(被觀察者)之間的連接切斷, 從而導致Observer(觀察者)收不到事件。
Disposable對象如何獲得?
Disposable的作用是切斷連接,確切地講是將Observer(觀察者)切斷,不再接收來自被觀察者的事件,而被觀察者的事件卻仍在繼續(xù)執(zhí)行。
因此Disposable的對象通過觀察者獲得,具體分為兩種方式。
Disposable對象的獲得
1.Observer接口

通過創(chuàng)建Observer接口,當訂閱后,建立與Observable的聯(lián)系,onSubscribe(Disposable d)中便可以獲得Disposable對象。
2.Observable對象subscribe方法

當subscribe()后直接返回一個Disposable 對象,獲得了Disposable對象后,我們便可以調用dispose()方法,在恰當的時機,斷開連接,停止接收Observable(被觀察者)發(fā)送的事件。
注意:當切斷被觀察者與觀察者之間的聯(lián)系,Observable(被觀察者)的事件卻仍在繼續(xù)執(zhí)行。
另外,補充一下onNext()、onComplete()和onError()事件的發(fā)送規(guī)則。
具體規(guī)則:
Observable(被觀察者)可以發(fā)送無限個onNext, Observer(觀察者)也可以接收無限個onNext.
當Observable(被觀察者)發(fā)送了一個onComplete后, Observable(被觀察者)中onComplete之后的事件將會繼續(xù)發(fā)送, 而Observer(觀察者)收到onComplete事件之后將不再繼續(xù)接收事件.
當Observable(被觀察者)發(fā)送了一個onError后, Observable(被觀察者)中onError之后的事件將繼續(xù)發(fā)送, 而Observer(觀察者)收到onError事件之后將不再繼續(xù)接收事件.
Observable(被觀察者)可以不發(fā)送onComplete或onError.
最為關鍵的是onComplete和onError必須唯一并且互斥, 即不能發(fā)多個onComplete, 也不能發(fā)多個onError, 也不能先發(fā)一個onComplete, 然后再發(fā)一個onError, 反之亦然
注:關于onComplete和onError唯一并且互斥這一點, 是需要自行在代碼中進行控制, 如果你的代碼邏輯中違背了這個規(guī)則, 并不一定會導致程序崩潰. 比如發(fā)送多個onComplete是可以正常運行的, 依然是收到第一個onComplete就不再接收了, 但若是發(fā)送多個onError, 則收到第二個onError事件會導致程序會崩潰。