RxJava2.x (三)RxJava+Retrofit
前面讲了RxJava2.x的使用,接下来这篇讲一下RxJava+Retrofit发送网络请求。
Android中有多种网络请求库, Retrofit便是其中的佼佼者,它的优势之一便是它支持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);
}
创建一个Retrofit
简书粘贴代码太难受了,我还是直接截图吧这样看的更清晰。接下来就可以进行网络请求:
03-06 15:46:40.062 26977-26977/com.android.rxjavademo E/RxJava2.x: 中国,重庆市
调用Api接口方法,返回一个Observable(被观察者)对象,然后当subscribe()订阅后,就可以在IO线程中执行网络 请求操作,最终Observer(观察者)对象在UI线程中获得ip详细信息。
其中请求返回的数据是json形式,IP类包含所有的返回数据,具体代码如下:
IP实体类 Country实体类以上仅仅以实例介绍RxJava的基础使用,RxJava的功能远不止于此。不过掌握了以上的技能,我们已经可以在我们的项目中应用RxJava进行异步操作了。关于一些RxJava中的细节及其他相关技术还需要慢慢积累。
Disposable简介及使用
下面我们另一个重要的概念Disposable。当Observer(观察者)与Observable(被观察者)通过subscribe()建立连接后,事件可以进行传递。当发生一些其他情况,不得不断开两者之间的连接时,该怎么操作?这个时候就该Disposable上场了。
Disposable简介
Disposable在RxJava中,用它来切断Observer(观察者)与Observable(被观察者)之间的连接,当调用它的dispose()方法时, 它就会将Observer(观察者)与Observable(被观察者)之间的连接切断, 从而导致Observer(观察者)收不到事件。
Disposable对象如何获得?
Disposable的作用是切断连接,确切地讲是将Observer(观察者)切断,不再接收来自被观察者的事件,而被观察者的事件却仍在继续执行。
因此Disposable的对象通过观察者获得,具体分为两种方式。
Disposable对象的获得
1.Observer接口
通过创建Observer接口,当订阅后,建立与Observable的联系,onSubscribe(Disposable d)中便可以获得Disposable对象。
2.Observable对象subscribe方法
当subscribe()后直接返回一个Disposable 对象,获得了Disposable对象后,我们便可以调用dispose()方法,在恰当的时机,断开连接,停止接收Observable(被观察者)发送的事件。
注意:当切断被观察者与观察者之间的联系,Observable(被观察者)的事件却仍在继续执行。
另外,补充一下onNext()、onComplete()和onError()事件的发送规则。
具体规则:
Observable(被观察者)可以发送无限个onNext, Observer(观察者)也可以接收无限个onNext.
当Observable(被观察者)发送了一个onComplete后, Observable(被观察者)中onComplete之后的事件将会继续发送, 而Observer(观察者)收到onComplete事件之后将不再继续接收事件.
当Observable(被观察者)发送了一个onError后, Observable(被观察者)中onError之后的事件将继续发送, 而Observer(观察者)收到onError事件之后将不再继续接收事件.
Observable(被观察者)可以不发送onComplete或onError.
最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然
注:关于onComplete和onError唯一并且互斥这一点, 是需要自行在代码中进行控制, 如果你的代码逻辑中违背了这个规则, 并不一定会导致程序崩溃. 比如发送多个onComplete是可以正常运行的, 依然是收到第一个onComplete就不再接收了, 但若是发送多个onError, 则收到第二个onError事件会导致程序会崩溃。