考虑到现实开发中,每个开发者遇到的开发环境都一样,有的需要自定义OkHttpClient对象设置不同的参数,有的还需要为每个请求添加公共参数或者为url统一添加前缀或者后缀,为此HttpSender提供了相关方法供开发者调用。
如果还未看过之前的文章,请移步
RxHttp 一条链发送请求,新一代Http请求神器(一)
RxHttp 介绍篇之生命周期、公共参数相关配置(二)
RxHttp 介绍篇之Parser介绍(三)
RxHttp 介绍篇之Param介绍(四)
RxHttp 介绍篇之多请求串行与并行(五)
RxHttp 扩展篇之Parser扩展(六)
RxHttp 扩展篇之Param扩展(七)
RxHttp 扩展篇之注解处理器 Generated API(八)
1、RxHttp初始化
HttpSender.init(OkHttpClient okHttpClient)//非必须,只能初始化一次,第二次将抛出异常
调用HttpSender.init方法,并传入自定义的OkHttpClient对象即可,可以传入null或者不初始化,这样就是使用HttpSender默认的OkHttpClient对象
2、添加公共参数,为url添加前缀或者后缀
调用HttpSender.setOnParamAssembly方法并传入一个Function接口对象,代码如下:
HttpSender.setOnParamAssembly(new Function() {
/**
* <p>在这里可以为所有请求添加公共参数,也可以为url统一添加前缀或者后缀
* <p>子线程执行,每次发送请求前都会被回调
*
* @param p Param
* @return 修改后的Param对象
*/
@Override
public Param apply(Param p) {
//根据不同请求添加不同参数
if (p instanceof GetRequest) {
} else if (p instanceof PostRequest) {
} else if (p instanceof PutRequest) {
} else if (p instanceof DeleteRequest) {
}
//为url 添加前缀或者后缀 并重新设置url
//p.setUrl("");
return p.add("versionName", "1.0.0")//添加公共参数
.addHeader("deviceType", "android"); //添加公共请求头
}
});
上面代码注释已经很详细,这里不再介绍
使用RxHttp,每个请求都会默认添加公共参数,如果不需要,可使用setAssemblyEnabled(boolean enabled)
方法,如:
RxHttp.get("http://...")
.setAssemblyEnabled(false) //设置是否添加公共参数,默认为true
.fromSimpleParser(String.class)
.subscribe(s -> {
//成功回调
}, throwable -> {
//失败回调
});
3、RxHttp生命周期处理
如果Activity销毁后,Http请求结果还没有返回,此时就会造成内存泄漏,并且回调回来时,可能会出现空指针等意料之外的异常,所以我们需要在Activity销毁时,取消观察者对被观察者的观察(也是订阅)。
RxJava为我们提供了一个类
CompositeDisposable mCompositeDisposable = new CompositeDisposable()
发送请求后,我们可以拿到Disposable对象,并将Disposable对象添加进CompositeDisposable对象,如下
Disposable disposable = RxHttp.get("http://www....") //这里get,代表Get请求
.fromSimpleParser(String.class) //from操作符,是异步操作
.subscribe(s -> {
//accept方法参数类型由上面SimpleParser传入的泛型类型决定
//走到这里说明Http请求成功,并且数据正确
}, throwable -> {
//Http请求出现异常,有可能是网络异常,数据异常等
});
//将Disposable对象添加进CompositeDisposable
mCompositeDisposable.add(disposable);//处理RxJava生命周期
最后在Activity onDestroy方法,调用CompositeDisposable对象的clear方法即可,对CompositeDisposable类很陌生的,自己去了解下,这里不做介绍。
@Override
protected void onDestroy() {
super.onDestroy();
mCompositeDisposable.clear();
}
what ??? 控制生命周期,这么繁琐的吗?好吧,其实还有一种超级简单的方式
使用RxLife
使用RxLife库,自动管理RxHttp生命周期,如:
RxHttp.get("http://www....") //这里get,代表Get请求
.fromSimpleParser(String.class) //from操作符,是异步操作
.as(RxLife.asOnMain(this)) //感知生命周期,并在主线程回调
.subscribe(s -> {
//accept方法参数类型由上面SimpleParser传入的泛型类型决定
//走到这里说明Http请求成功,并且数据正确
}, throwable -> {
//Http请求出现异常,有可能是网络异常,数据异常等
});
详细用法,请查看RxLife 一款轻量级别的RxJava生命周期管理库
4、RxJava全局异常捕获
//设置RxJava 全局异常处理
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
/**
* RxJava2的一个重要的设计理念是:不吃掉任何一个异常,即抛出的异常无人处理,便会导致程序崩溃
* 这就会导致一个问题,当RxJava2“downStream”取消订阅后,“upStream”仍有可能抛出异常,
* 这时由于已经取消订阅,“downStream”无法处理异常,此时的异常无人处理,便会导致程序崩溃
*/
}
});
为啥要设置RxJava的全局异常,看上面代码注释部分。