Rxjava Retrofit 封装Http请求 实现生命周期管理和基类code的处理

582 阅读3分钟

解决问题

  1. 解决不同基类BaseBean的返回结果判断 (参照 mp.weixin.qq.com/s/Qu-sNjU9u… )
  2. lifecycle 解决页面生命周期问题 不需要引入三方的AUtoDispose 或者 RxLifeCycle 类库

初始化

初始化配置参数按需要来配置

 RxHttp.initConfig(new ConfigModule() {
            @Override
            public void applyOptions(GlobalConfigBuild.Builder builder) {
                builder
                        .addInterceptor(new LoggerInterceptor())
                        .baseurl("http://lf.snssdk.com/api/")
                        .setPaeseInfor(new ParseInfo("errorCode", "data", "errorMsg", "0"))
                        .setAPICallBack(new APICallBack() {
                            @Override
                            public String callback(String code, String resultData) {
                                return null;
                            }
                        });

            }
        });

基类封装方式

框架是基于Rxjava的 所以可以使用map操作符 去将接口返回的String 做一层过滤去获取到返回数据的code mes data 这里可以对数据状态进行统一判断 数据获取争取返回字符串类型的data 当然也可以将data json格式化之后再返回,这里我们这个map 只做数据状态的判断,下边是整个状态判断的代码

为了应对不同接口基类状态字段的不同我们定义了 paseInfor 来将基本的code msg data 以及成功码 统一外部传入 用这些字符串字段来匹配接口数据 详细方式请查看源代码. 下一步我们在将返回的data 字符串转成业务实体 ,实体type外部传入class,这里将整个数据状态判断 ,数据实体转换,以及线程切换统一封装到Transformer中 方便使用时直接调用compose 来实现这三个步骤

完整的使用方式如下


            RxHttp
                .create()  //一 .获取BaseApi
                .get("https://www.wanandroid.com/banner/json", SimpleParams.create().put("", "")) //二. 调用请求方法
                .compose(Transformer.switchSchedulersArray(DataBean.class)) //三. 返回结果处理
                .subscribe(new CommonObserver<List<DataBean>>(mBaseView) { //四.发起订阅
                    @Override
                    public void onNext(List<DataBean> dataBeans) {
                        DataBean dataBean = dataBeans.get(0);
                        System.out.println(dataBean.getDesc());

                    }

                    @Override
                    protected void onError(int code, String mes) {
                        super.onError(code, mes);
                        System.out.println(code + "===" + mes);

                    }

                });

这里我们直接使用 的BaseApi 当然我们也可以使用自己定义的APi 可以调用creata()的另一个有参方法 传入我们自定义的请求APi,自定义APi 返回值可以是String 也可以是业务实体. 如果是业务实体 那在compose里可以不使用我们封装的转换方式,只需要做线程切换即可.可以调用Transformer 的另一个方法switchThread 值进行线程的切换. 如果返回值没有基类的 code msg data 可以直接使用可以调用Transformer的switchSchedulersNoBase方法 直接转成业务实体 自定义Api 使用方式如下


        RxHttp
                .create(ApiServer.class)
                .get("client_credentials",
                        "PPSSlAbaCYZpe8IhLQwWWinS",
                        "noqd2GKQmrpwhLu3hEuUi9X5cGQDfGw6")
                .compose(Transformer.<ResToken>switchThread())
                .subscribe(new CommonObserver<ResToken>(mBaseView) {
                    @Override
                    public void onNext(ResToken resToken) {
                        System.out.println(resToken.access_token);

                    }

                    @Override
                    protected void onError(int code, String mes) {
                        super.onError(code, mes);
                        System.out.println(code + "=====" + mes);

                    }

                });

        RxHttp
                .create()
                .get("https://aip.baidubce.com/oauth/2.0/token", SimpleParams.create()
                        .put("grant_type", "client_credentials")
                        .put("client_id", "PPSSlAbaCYZpe8IhLQwWWinS")
                        .put("client_secret", "noqd2GKQmrpwhLu3hEuUi9X5cGQDfGw6"))

                .compose(Transformer.switchSchedulersNoBase(ResToken.class))
                .observeOn(Schedulers.io())
                .flatMap(new Function<ResToken, ObservableSource<String>>() {
                    @Override
                    public ObservableSource<String> apply(ResToken resToken) throws Exception {
                        System.out.println("============Token 请求成功");
                        ReqToken reqToken = new ReqToken();
                        reqToken.image = "2164728647816478264781242746127846";
                        reqToken.image_type = "BASE64";
                        reqToken.face_field = "age,beauty,expression,faceshape,gender,glasses,landmark,race,qualities";
                        reqToken.max_face_num = "10";
                        reqToken.face_type = "LIVE";
                        reqToken.access_token = resToken.access_token;
                        return RxHttp
                                .create()
                                .post("https://aip.baidubce.com/rest/2.0/face/v3/detect", reqToken)
                                .compose(Transformer.<String>switchThread());
                    }
                })
                .subscribe(new CommonObserver<String>(mBaseView) {
                    @Override
                    public void onNext(String s) {
                        System.out.println("=======" + s);
                    }

                    @Override
                    protected void onError(int code, String mes) {
                        super.onError(code, mes);
                    }
                });

    }

生命周期的管理

生命周期使用jetpacK的 lifecycle 管理, 可以在被订阅者里注册lifecycle 监听周期变化 也可以自定义操作符来实现,可以在Rxjava 订阅时构造函数中传入 Lifecycle对象进行注册 ,在onSubscribe 回调中得到 Disposable 在onDestroy中去对Disposable 做取消操作

public abstract class BaseObserver<T> implements Observer<T>, LifecycleObserver {

    /**
     *要想实现生命周期的去掉订阅操作必须传入可以获取到lifeCycle 的对象
     *
     * @param lifecycle
     */
    public BaseObserver(Object lifecycle) {
        if (lifecycle != null) {
            if (lifecycle instanceof AppCompatActivity) {
                ((AppCompatActivity) lifecycle).getLifecycle().addObserver(this);
                return;
            }
            if (lifecycle instanceof Fragment) {
                ((Fragment) lifecycle).getLifecycle().addObserver(this);
                return;
            }
            if (lifecycle instanceof Lifecycle) {
                ((Lifecycle) lifecycle).addObserver(this);
                return;
            }

        }
    }


    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
        BaseException apiException = null;
        if (e instanceof BaseException) {
            apiException = (BaseException) e;
        } else {
            apiException = getErrorType(e);
        }
        String message = apiException.getMessage();
        int code = apiException.getCode();
        onError(code, message);

    }

    @Override
    public void onComplete() {

    }


    protected void onError(int code, String mes) {

    }

    protected BaseException getErrorType(Throwable e) {
        return DefaultException.handleException(e);
    }

    private Disposable disposable;

    @Override
    public void onSubscribe(Disposable d) {
        disposable = d;
    }

    private final void cancel(LifecycleOwner owner) {
        if (this.disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
        if (owner != null) {
            owner.getLifecycle().removeObserver(this);
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy(LifecycleOwner owner) {
        this.cancel(owner);
    }
}

github地址