RxJava2.x (三)RxJava+Retrofit

前面講了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類包含所有的返回數據,具體代碼如下:


IP實體類
Country實體類

以上僅僅以實例介紹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事件會導致程序會崩潰。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容