0°

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

内容预览:
  • 上面的代码中,MovieLoader是从ObjectLoader 中继承下来的,ObjectLoade...~
  • 五,统一处理结果和错误 1,统一处理请求结果 现实项目中,所有接口的返...~
  • 封装的类放在http包下: 最后放几张Demo示例的效果图:(数据来自干货集...~

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

前面一篇文章讲了一下Retrofit+ RxJava 请求网络的一些基本用法,还没有看过的可以去看一下Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇,正如标题所说的,Retrofit+RxJava 是让我们的网络请求变得简单,代码精简。通过前一篇文章,我们感觉写一个请求还是有点麻烦,作为程序员,我们的目标就是“偷懒”,绝不重复搬砖。因此我们还需要封装一下,来简化我们使用,接下来进入正题。

一,创建一个统一生成接口实例的管理类RetrofitServiceManager

我们知道,每一个请求,都需要一个接口,里面定义了请求方法和请求参数等等,而获取接口实例需要通过一个Retrofit实例,这一步都是相同的,因此,我们可以把这些相同的部分抽取出来,代码如下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

说明:创建了一个RetrofitServiceManager类,该类采用单例模式,在私有的构造方法中,生成了Retrofit 实例,并配置了OkHttpClient和一些公共配置。提供了一个create()方法,生成接口实例,接收Class范型,因此项目中所有的接口实例Service都可以用这个来生成,代码如下:

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

通过create()方法生成了一个MovieService

二,创建接口,通过第一步获取实例

上面已经有了可以获取接口实例的方法因此我们需要创建一个接口,代码如下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

好了,有了接口我们就可以获取到接口实例了mMovieService

三,创建一个业务Loader ,如XXXLoder,获取Observable并处理相关业务

解释一下为什么会出现Loader ,我看其他相关文章说,每一个Api 都写一个接口,我觉得这样很麻烦,因此就把请求逻辑封装在在一个业务Loader 里面,一个Loader里面可以处理多个Api 接口。代码如下:

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

创建一个MovieLoader,构造方法中生成了mMovieService,而Service 中可以定义和业务相关的多个api,比如:例子中的MovieService中,
可以定义和电影相关的多个api,获取电影列表、获取电影详情、搜索电影等api,就不用定义多个接口了。

上面的代码中,MovieLoader是从ObjectLoader 中继承下来的,ObjectLoader 提取了一些公共的操作。代码如下:

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

相当于一个公共方法,其实也可以放在一个工具类里面,后面做缓存的时候会用到这个父类,所以就把这个方法放到父类里面。

四,Activity/Fragment 中的调用

创建Loader实例

mMovieLoader = new MovieLoader();

通过Loader 调用方法获取结果,代码如下:

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

以上就完成请求过程的封装,现在添加一个新的请求,只需要添加一个业务Loader 类,然后通过Loader调用方法获取结果就行了,是不是方便了很多?但是在实际项目中这样是不够的,还能做进一步简化。

五,统一处理结果和错误

1,统一处理请求结果

现实项目中,所有接口的返回结果都是同一格式,如:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

我们在请求api 接口的时候,只关心我们想要的数据,也就上面的data,其他的东西我们不太关心,请求失败的时候可以根据status判断进行错误处理,所以我们需要包装一下。首先需要根据服务端定义的JSON 结构创建一个BaseResponse 类,代码如下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇
有了统一的格式数据后,我们需要剥离出data 返回给上层调用者,创建一个PayLoad 类,代码如下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

PayLoad  继承自Func1,接收一个BaseResponse, 就是接口返回的JSON数据结构,返回的是T,就是data,判断是否请求成功,请求成功返回Data,请求失败包装成一个Fault 返回给上层统一处理错误。在Loader类里面获取结果后,通过map 操作符剥离数据。代码如下:

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

2,统一处理错误

在PayLoad 类里面,请求失败时,抛出了一个Fault 异常给上层,我在Activity/Fragment 中拿到这个异常,然后判断错误码,进行异常处理。在onError () 中添加代码如下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

以上就可以对应错误码处理相应的错误了。

六,添加公共参数

在实际项目中,每个接口都有一些基本的相同的参数,我们称之为公共参数,比如:userId、userToken、userName,deviceId等等,我们不必要,每个接口都去写,这样就太麻烦了,因此我们可以写一个拦截器,在拦截器里面拦截请求,为每个请求都添加相同的公共参数。拦截器代码如下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

以上就是添加公共参数的拦截器,在RetrofitServiceManager 类里面加入OkHttpClient 配置就好了。代码如下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

这样每个请求都添加了公共参数。

好了,以上一个简易的网络请求库就封装得差不多了,完整代码请戳Retrofit + RxJava +OkHttp 简易封装基本上能满足项目中的网络请求,由于项目中暂时没有文件上传下载的需求,这一块还没有添加,后面有时间会补充这一块的东西。

封装的类放在http包下:
Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

最后放几张Demo示例的效果图:(数据来自干货集中营)
重点是看妹纸!!!(滑稽脸)

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

电影列表:(数据来自豆瓣)

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

以上就是封装的全部内容,还没有用Retrofit 的,赶快用上它来改造你的网络请求库吧!!!

参考博客:
RxJava 与 Retrofit 结合的最佳实践

Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇

Android技术杂货铺

长按二维码关注我们吧!

始发于微信公众号: Android技术杂货铺

以上就是:Retrofit + RxJava + OkHttp 让网络请求变的简单-封装篇 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论