前面講了RxJava2.x的使用,接下來(lái)這篇講一下RxJava+Retrofit發(fā)送網(wǎng)絡(luò)請(qǐng)求飞盆。
Android中有多種網(wǎng)絡(luò)請(qǐng)求庫(kù), Retrofit便是其中的佼佼者娄琉,它的優(yōu)勢(shì)之一便是它支持RxJava的方式來(lái)調(diào)用次乓。我們便以Retrofit進(jìn)行網(wǎng)絡(luò)請(qǐng)求,RxJava進(jìn)行異步處理孽水,兩者結(jié)合來(lái)講解RxJava在網(wǎng)絡(luò)請(qǐng)求中的具體使用票腰。
本例中 我們使用淘寶IP地址庫(kù),獲取ip的詳細(xì)信息(沒(méi)找可以直接使用的天氣查詢接口女气,還得注冊(cè)太麻煩了)杏慰。
接口url:http://ip.taobao.com/service/getIpInfo.php?ip=202.202.32.202
具體請(qǐng)求的返回?cái)?shù)據(jù)形式如下:
下面以上述數(shù)據(jù)簡(jiǎn)單講解一下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)建一個(gè)Retrofit?
接下來(lái)就可以進(jìn)行網(wǎng)絡(luò)請(qǐng)求:
03-06 15:46:40.062 26977-26977/com.android.rxjavademo E/RxJava2.x: 中國(guó),重慶市
調(diào)用Api接口方法,返回一個(gè)Observable(被觀察者)對(duì)象谒主,然后當(dāng)subscribe()訂閱后完域,就可以在IO線程中執(zhí)行網(wǎng)絡(luò) 請(qǐng)求操作,最終Observer(觀察者)對(duì)象在UI線程中獲得ip詳細(xì)信息瘩将。
其中請(qǐng)求返回的數(shù)據(jù)是json形式,IP類包含所有的返回?cái)?shù)據(jù)凹耙,具體代碼如下:
以上僅僅以實(shí)例介紹RxJava的基礎(chǔ)使用姿现,RxJava的功能遠(yuǎn)不止于此。不過(guò)掌握了以上的技能肖抱,我們已經(jīng)可以在我們的項(xiàng)目中應(yīng)用RxJava進(jìn)行異步操作了备典。關(guān)于一些RxJava中的細(xì)節(jié)及其他相關(guān)技術(shù)還需要慢慢積累。
Disposable簡(jiǎn)介及使用
下面我們另一個(gè)重要的概念Disposable意述。當(dāng)Observer(觀察者)與Observable(被觀察者)通過(guò)subscribe()建立連接后提佣,事件可以進(jìn)行傳遞。當(dāng)發(fā)生一些其他情況荤崇,不得不斷開(kāi)兩者之間的連接時(shí)拌屏,該怎么操作?這個(gè)時(shí)候就該Disposable上場(chǎng)了。
Disposable簡(jiǎn)介
Disposable在RxJava中,用它來(lái)切斷Observer(觀察者)與Observable(被觀察者)之間的連接术荤,當(dāng)調(diào)用它的dispose()方法時(shí), 它就會(huì)將Observer(觀察者)與Observable(被觀察者)之間的連接切斷, 從而導(dǎo)致Observer(觀察者)收不到事件倚喂。
Disposable對(duì)象如何獲得?
Disposable的作用是切斷連接瓣戚,確切地講是將Observer(觀察者)切斷端圈,不再接收來(lái)自被觀察者的事件,而被觀察者的事件卻仍在繼續(xù)執(zhí)行子库。
因此Disposable的對(duì)象通過(guò)觀察者獲得舱权,具體分為兩種方式。
Disposable對(duì)象的獲得
1.Observer接口
通過(guò)創(chuàng)建Observer接口,當(dāng)訂閱后仑嗅,建立與Observable的聯(lián)系宴倍,onSubscribe(Disposable d)中便可以獲得Disposable對(duì)象张症。
2.Observable對(duì)象subscribe方法
當(dāng)subscribe()后直接返回一個(gè)Disposable 對(duì)象,獲得了Disposable對(duì)象后啊楚,我們便可以調(diào)用dispose()方法吠冤,在恰當(dāng)?shù)臅r(shí)機(jī),斷開(kāi)連接恭理,停止接收Observable(被觀察者)發(fā)送的事件拯辙。
注意:當(dāng)切斷被觀察者與觀察者之間的聯(lián)系,Observable(被觀察者)的事件卻仍在繼續(xù)執(zhí)行颜价。
另外涯保,補(bǔ)充一下onNext()、onComplete()和onError()事件的發(fā)送規(guī)則周伦。
具體規(guī)則:
Observable(被觀察者)可以發(fā)送無(wú)限個(gè)onNext, Observer(觀察者)也可以接收無(wú)限個(gè)onNext.
當(dāng)Observable(被觀察者)發(fā)送了一個(gè)onComplete后, Observable(被觀察者)中onComplete之后的事件將會(huì)繼續(xù)發(fā)送, 而Observer(觀察者)收到onComplete事件之后將不再繼續(xù)接收事件.
當(dāng)Observable(被觀察者)發(fā)送了一個(gè)onError后, Observable(被觀察者)中onError之后的事件將繼續(xù)發(fā)送, 而Observer(觀察者)收到onError事件之后將不再繼續(xù)接收事件.
Observable(被觀察者)可以不發(fā)送onComplete或onError.
最為關(guān)鍵的是onComplete和onError必須唯一并且互斥, 即不能發(fā)多個(gè)onComplete, 也不能發(fā)多個(gè)onError, 也不能先發(fā)一個(gè)onComplete, 然后再發(fā)一個(gè)onError, 反之亦然
注:關(guān)于onComplete和onError唯一并且互斥這一點(diǎn), 是需要自行在代碼中進(jìn)行控制, 如果你的代碼邏輯中違背了這個(gè)規(guī)則, 并不一定會(huì)導(dǎo)致程序崩潰. 比如發(fā)送多個(gè)onComplete是可以正常運(yùn)行的, 依然是收到第一個(gè)onComplete就不再接收了, 但若是發(fā)送多個(gè)onError, 則收到第二個(gè)onError事件會(huì)導(dǎo)致程序會(huì)崩潰夕春。