前言
本篇文章主要介绍Rxjava与Retrofit结合使用,对Rxjava和Retrofit不熟悉的可以去看我之前的两篇介绍
基本使用
定义请求接口
1 | public interface GetRequest_Interface { |
创建 Retrofit接口实例
1 |
|
构建请求参数
这里以请求体为Json 字符串为准
1 | HashMap<String, Object> map = new HashMap<>(); |
开始网络请求
1 | Observable<School> observable = request.postSchool(body); |
至此,Rxjava 与 Retrofit 结合基本使用就结束了,基于以上就可以愉快的完成网络请求工作了,是不是很方便简洁.
当然了,对于我们的业务来说,不可能只有一次网络请求,基本处处都需要进去网络请求,而且也不可能如上面一样,如此简单. 一般我们的业务中都需要配置一些其他的参数信息,如果每一次网络请求都像上面那样写的话,当然是可以的,但是你的代码就太low了,也不符合编程规范.
所以基于你会熟练的使用了的前提下,我们就需要将以上代码进行简单封装.
关于封装我想多说一句
对于封装,很多人都认为封装就是使代码足够简洁,逻辑足够清晰,符合开闭原则等,的确是这样的,但是需要使情况而定,如果你写的代码是服务广大人群,也就是开源项目,那就要考虑很多因素,做到足够开放.
但如果只是用到自己的项目里,那我们必须要明确一点,那就是定制化的前提是符合自己业务的需求,而不要过于封装.所以也就有为什么我们常常需要对别人的开源框架做二次封装,就是这个道理,没有最好的封装,只有最合适的封装.
封装篇
Url统一存放
1 | public interface API { |
存放所有请求api
1 | public interface GetRequest_Interface { |
封装处理网络请求所需的参数信息
- 初始化 配置 OkHttpClient
1 | 根据自己业务需求初始化OkHttpClient |
这里需要用到OkHttp3的拦截器相关内容,不熟悉的可以先去了解
- 统一添加公共请求头
1 | Interceptor tokenInterceptor = new Interceptor() { //全局拦截器, |
- 全局动态添加Token
1 | Interceptor tokenInterceptor = new Interceptor() { //全局拦截器,往请求头部添加 token 字段,实现了全局添加 token |
这里使用了腾讯的MMKV框架进去本地存储Token,因为我们一开始是没有拿到Token的,所以需要进行动态添加
- 自动判断token是否过期,过期无感刷新
在进行网络交互的时候,服务端签发的Token是有时效性的而且一般比较短,过了有效期就需要重新请求,而这个过程我们不能让用户察觉到,所以需要实现用户无感知的情况下刷新请求新的Token.
1 | Interceptor tokenRespInterceptor = new Interceptor() { //拦截返回体 判断token是否过期.过期重写拉取新的token |
这里需要根据服务端约定好的过期规则进去判断,这里简单示范一下
1 |
|
获取新的Token
1 | /** |
- 初始化 配置 Retrofit
1 | retrofit = new Retrofit.Builder() |
至此,关于网络请求的相关参数信息就基本配置完成
将上述配置步骤进行封装
1 |
|
如果业务中有多个BaseUrl的话,可以直接写个方法暴露出去就好了.
统一处理请求结果的BaseObserver
- 首先创建一个请求结果的回调 ResponseCallBack
1 | public interface ResponseCallBack<T> { |
- 创建一个请求开始时的初始化回调 ProgressListener
1 | public interface ProgressListener { |
- 创建统一处理结果的BaseObserver
创建BaseObserver,在回调中进行业务处理1
2
3
4
5
6
7
8
9
10
11
12public class BaseObserver<T> implements Observer<T> {
private ResponseCallBack responseCallBack;
private ProgressListener progressListener;
private Disposable disposable;
public BaseObserver(ResponseCallBack responseCallBack,ProgressListener progressListener){
this.responseCallBack = responseCallBack;
this.progressListener = progressListener;
}
}
在 onSubscribe () 方法中进行请求开始时的初始化操作
1 | @Override |
在 onNext () 方法中处理请求成功业务
1 | @Override |
在onError () 方法中统一处理请求失败信息
1 | @Override |
在 onComplete () 中处理请求成功结束后的业务
1 | @Override |
代码如下:
1 | /** |
至此,统一处理结果的BaseObserver封装完毕
其他 (请求传参,返回JSON)
这里根据服务端接收数据不同而有不同方式,想要了解更多传参方式,可以自行去了解Retrofit的注解,这里只介绍向服务端传递Json数据.
- Json 数据格式
首先我们看一下标准的Json数据格式
1 | 返回体: |
返回体的数据解析就不说了,说说请求体怎么传递
首先我们把最外面的{ } json 对象当做是一个 map 对象,这样是不是一下子就知道怎么转化了,对的,就是你想的那样.
1 | HashMap<String, Object> map = new HashMap<>(); |
然后把map对象转化成json字符串,传给服务端就行了
1 | Gson gson=new Gson(); |
至于更复杂的请求体也是一样的做法
1 | { |
上面的请求体中有个json数组,数组里面又嵌套了json对象,还是一样的做法
把json数组看成是一个list,对的,有和上面一样的套路了是不是很简单,
使用示例
这里以登录业务做个简单示范
1 |
|
这样一来,是不是代码明了简洁,代码质量明显提高了一个层次
至此,Rxjava 和 Retrofit 结合使用 与封装就基本完成了,再次说明一下,没有最完美的封装,只有最适合自己业务的封装,所以,如果需要请进行自己的业务定制,这里只提供思路.
欢迎关注作者darryrzhong,更多干货等你来拿哟.
请赏个小红心!因为你的鼓励是我写作的最大动力!
更多精彩文章请关注