前言
如何通过结合Retrofit
框架来进行网络请求,也是RxJava
的学习过程中必须要掌握的一环。网上已经有很多开源项目和文章介绍了,今天这篇文章,我们就通过一个简单的例子,通过RxJava + Retrofit
的方式实现网络请求。
这个例子很简单,我们通过 干货集中营 提供的接口,分别请求Android
类和iOS
类的资讯,并将这两个接口所返回的数据在界面上进行展示。
通过该例子,可以学习如何将Retrofit
和RxJava
结合,并通过zip
操作符实现等待多个网络请求完成。
示例
首先来熟悉一下所用到的测试接口,其数据来自于 干货集中营,这里选择Android
和iOS
两类的资讯,通过接口的描述,可以知道发起请求时的变量包含三个:
返回的数据格式如下:
2.2 编写 Entity 类
根据分析好的数据格式,我们编写对应的Entity
类:
接下来,在build.gradle
文件中,引入必要的依赖,以下三个依赖包的作用分别为:
Retrofit
的核心库Call<Response>
转换成Call<NewsEntity>
Call<NewsEntity>
转换成Observable<NewsEntity>
按照Retrofit
的使用介绍,我们需要定义一个接口类,这个接口类的返回值为Observable<NewsEntity>
,也就是我们之前定义好的数据结构。而这个接口接收三个参数:请求类型、请求个数、请求所在页数。
当我们需要请求数据时,就应当像下面这样构造一个Observable<NewsEntity>
:
baseUrl
:定义请求链接的前缀addConverterFactory
:将OKHttp
返回的标准Response
解析成我们所需要的数据类型NewsEntity
addCallAdapterFactory
:将Call<NewsEntity>
转换成Observable<NewsEntity>
,这样才能真正将Retrofit
和RxJava
结合起来。以上就是所有的准备工作,回顾一下我们主要做了以下四步,这也是今后我们使用其它任意接口时的标准流程:
Entity
url
组成方式定义Retrofit
所需要的接口声明,接口函数的返回类型为Observable<Entity>
,其中Entity
就是第二步中定义好的返回数据类型。Retrofit
,根据第三步的接口定义,返回真正的Observable
。其实经过以上的四步,我们的工作就基本上完成了,只需要把上面第四步中返回的Observable<XXXEntity>
当做一个发送数据的普通数据源就可以了。
示例代码如下,我们请求了Android
和iOS
两个接口,并且使用zip
操作符让两个接口都返回之后,才将数据呈现给用户,同时每次点击刷新资讯之后,我们将页数增加一以请求新的资讯。
示例解析
关于如何使用Retrofit + RxJava
前面已经说得比较清楚了,下面我们重点介绍一下新接触的两个操作符,flatMap
和zip
。
flatMap
的原理图如下所示:
它接收一个Function
函数,对于上游发送的每个事件它都会应用该函数,这个函数返回一个新的Observable
,如果有多个Observable
,那么他会发送合并后的结果。
在上面的例子中,上游的just
发送一个请求的所在页数,我们根据这个页数再去创建一个新的Observable
来发送数据。
zip
操作符的原理图如下所示:
它接收多个Observable
,以及一个函数,该函数的形参为这些Observable
发送的数据,并且要等所有的Observable
都发射完会后才会回调该函数。
通过zip
操作符,我们就可以实现等待多个网络请求完成再返回的需求,例如在上面的例子中,我们会等待Android
和iOS
类的资讯请求都返回之后,再合并它们的结果发送给下游,在界面上展示。
最后
关于rxjava更多的实战,推荐此文: