RxHttp 介绍篇之生命周期、公共参数相关配置(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liujingxing93/article/details/86639440

考虑到现实开发中,每个开发者遇到的开发环境都一样,有的需要自定义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的全局异常,看上面代码注释部分。

猜你喜欢

转载自blog.csdn.net/liujingxing93/article/details/86639440