RxHttp 让你眼前一亮的Http请求框架( 四 )

虽然初始化是非必须的,但是建议大家传入自定义的OkHttpClient对象,一来,自定义的OkHttpClient能最大化满足自身的业务;二来,随着RxHttp版本的升级,默认的OkHttpClient可能会发生变化(虽然可能性很小),故建议自定义OkHttpClient对象传入RxHttp 。
3.5、公共参数/请求头RxHttp支持为所有的请求添加公共参数/请求头,当然,如果你希望某个请求不添加公共参数/请求头,也是支持的,而且非常简单 。如下:
RxHttp.setOnParamAssembly(new Function() {@Overridepublic Param apply(Param p) { //此方法在子线程中执行,即请求发起线程Method method = p.getMethod();if (method.isGet()) {//可根据请求类型添加不同的参数} else if (method.isPost()) {}return p.add("versionName", "1.0.0")//添加公共参数.addHeader("deviceType", "android"); //添加公共请求头}});我们需要调用RxHttp.setOnParamAssembly(Function)方法,并传入一个Function接口对象,每次发起请求,都会回调该接口 。
当然,如果希望某个请求不回调该接口,即不添加公共参数/请求头,则可以调用setAssemblyEnabled(boolean)方法,并传入false即可,如下:
RxHttp.get("/service/...")//get请求.setAssemblyEnabled(false)//设置是否添加公共参数/头部,默认为true.asString()//返回字符串数据.subscribe(s -> {//这里的s为String类型//请求成功}, throwable -> {//请求失败});3.6、多域名/动态域名3.6.1、多域名
现实开发中,我们经常会遇到多个域名的情况,其中1个为默认域名,其它为非默认域名,对于这种情况,RxHttp提供了@DefaultDomain()、@Domain()这两个注解来标明默认域名和非默认域名,如下:
public class Url {@DefaultDomain() //设置为默认域名public static String baseUrl = "https://www.wanandroid.com/"@Domain(name = "BaseUrlBaidu") //非默认域名,并取别名为BaseUrlBaidupublic static String baidu = "https://www.baidu.com/";@Domain(name = "BaseUrlgoogle") //非默认域名,并取别名为BaseUrlGooglepublic static String google = "https://www.google.com/";}通过@Domain()注解标注非默认域名,就会在RxHttp类中生成setDomainToXxxIfAbsent()方法,其中Xxx就是注解中取的别名 。
上面我们使用了两个@Domain()注解,此时(需要Rebuild一下项目)就会在RxHttp类中生成setDomainToBaseUrlBaiduIfAbsent()、setDomainToBaseUrlGoogleIfAbsent()这两方法,此时发请求,我们就可以使用指定的域名,如下:
//使用默认域名,则无需添加任何额外代码//此时 url = "https://www.wanandroid.com/service/..." RxHttp.get("/service/...").asString().subscribe();//手动输入域名,此时 url = "https://www.mi.com/service/..."RxHttp.get("https://www.mi.com/service/...").asString().subscribe();//手动输入域名时,若再次指定域名,则无效//此时 url = "https://www.mi.com/service/..."RxHttp.get("https://www.mi.com/service/...").setDomainToBaseUrlBaiduIfAbsent()//此时指定Baidu域名无效.asString().subscribe();//使用谷歌域名,此时 url = "https://www.google.com/service/..."RxHttp.get("/service/...").setDomainToBaseUrlGoogleIfAbsent() //指定使用Google域名.asString().subscribe();通过以上案例,可以知道,RxHttp共有3种指定域名的方式,按优先级排名分别是:手动输入域名 > 指定非默认域名 > 使用默认域名 。
3.6.2、动态域名
现实开发中,也会有动态域名切换的需求,如域名被封、或者需要根据服务端下发的域名去配置,这对于RxHttp来说简直就是 so easy !!! 我们只需要对BaseUrl重新赋值,此时发请求便会立即生效,如下:
//此时 url = "https://www.wanandroid.com/service/..."RxHttp.get("/service/...").asString().subscribe();Url.baseUrl = "https://www.qq.com"; //动态更改默认域名,改完立即生效,非默认域名同理//此时 url = "https://www.qq.com/service/..."RxHttp.get("/service/...").asString().subscribe();3.7、关闭请求我们知道,在Activity/Fragment中发起请求,如果页面销毁时,请求还未结束,就会有内存泄漏的危险,因此,我们需要在页面销毁时,关闭一些还未完成的请求,RxHttp提供了两种关闭请求的方式,分别是自动+手动 。
3.7.1、自动关闭请求
自动关闭请求,需要引入本人开源的另一个库RxLife,先来看看如何用:
//以下代码均在FragmentActivty/Fragment中调用RxHttp.postForm("/service/...").asString().as(RxLife.as(this)) //页面销毁、自动关闭请求.subscribe();//或者RxHttp.postForm("/service/...").asString().as(RxLife.asOnMain(this)) //页面销毁、自动关闭请求 并且在主线程回调观察者.subscribe();//kotlin用户,请使用life或lifeOnMain方法,如下:RxHttp.postForm("/service/...").asString().life(this) //页面销毁、自动关闭请求.subscribe();//或者RxHttp.postForm("/service/...").asString().lifeOnMain(this) //页面销毁、自动关闭请求 并且在主线程回调观察者.subscribe();


推荐阅读