美文网首页Android 入门进阶
RxJava2.x (三)RxJava+Retrofit

RxJava2.x (三)RxJava+Retrofit

作者: MarvinGuo | 来源:发表于2017-03-03 19:07 被阅读3434次

    前面讲了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事件会导致程序会崩溃。

    相关文章

      网友评论

      • WangDDY:定义Api接口:

        public interfaceApi {

        @get("getIpInfo.php") Observable getIPInfo(@Query("ip") String ip);

        }

        請問樓主有沒有定義Api接口的方法入門介紹和深入學習的文章呢? 非常感謝!

      本文标题:RxJava2.x (三)RxJava+Retrofit

      本文链接:https://www.haomeiwen.com/subject/nkdrgttx.html