Android 使用RxJava+Retrofit 2.0合并网络请求

在开发验证码的功能时,要求验证code的同时判断这个是不是服务码(服务人员专用),这个就需要同时去请求两个接口,只要有一个功能就算成功,不再执行两个接口

这个问题可以使用RxJava的flatmap完成一次嵌套请求,有一点需要注意的是,我们需要在第一个接口调用失败的情况下,去请求第二个接口,我们先去验证验证码,再验证服务码。

    @Override
    public void checkConfirmCode(String deviceId, String code, OnAPIListener listener) {

        Map map = new HashMap<>();
        map.put("equ_code", deviceId);
        map.put("confirm_code", code);

        Call call = api.checkConfirmCode(map);
        call.enqueue(new Callback() {

            @Override
            public void onResponse(Call call, Response response) {
                if(response.body()==null){
                    return;
                }
                LogUtil.e("httpclient checkConfirmCode success:"+response.body());
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                LogUtil.e("httpclient checkConfirmCode fail:"+t.getMessage());

            }
        });
    }

    @Override
    public void checkEquPassword(String deviceId, String code, final OnAPIListener listener) {

        Map map = new HashMap<>();
        map.put("equ_code", deviceId);
        map.put("equ_password", code);

        Call call = api.checkEquPassword(map);
        call.enqueue(new Callback() {

            @Override
            public void onResponse(Call call, Response response) {
                if(response.body()==null){
                    return;
                }
                LogUtil.e("httpclient checkConfirmCode success:"+response.body());
                listener.onSuccess(response.body());
            }

            @Override
            public void onFailure(Call call, Throwable t) {
                LogUtil.e("httpclient checkConfirmCode fail:"+t.getMessage());
                listener.onError(t);
            }
        });
    }

    /**
     * 验证四位验证码
     * @return
     */
    @Headers({"Accept:application/x.vr.v1.0.1+json","Authorization:*****"})
    @POST("bus/checkconfirmcode")
    @FormUrlEncoded
    Call checkConfirmCode(@FieldMap Map map);

    /**
     * 验证四位密码
     * @return
     */
    @Headers({"Accept:application/x.vr.v1.0.1+json","Authorization:*****"})
    @POST("bus/checkequpassword")
    @FormUrlEncoded
    Call checkEquPassword(@FieldMap Map map);


我们看到有两个接口,一个是验证码接口,一个是密码接口,传参是相同的,网络请求map略有不同,一个是“equ_password”,一个是“equ_code”。我们看到改造之前是单独使用retrofit 2.0进行封装的。

    /**
     * 验证四位验证码
     * @return
     */
    @POST("bus/checkconfirmcode")
    Observable checkConfirmCode(@Query("equ_code") String deviceId, @Query("confirm_code") String code);

    /**
     * 验证四位验证码
     * @return
     */
    @POST("bus/checkequpassword")
    Observable checkEquPassword(@Query("equ_code") String deviceId,  @Query("equ_password") String code);
改造之后的Retrofit API

    compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0'
    compile 'io.reactivex:rxandroid:1.2.1'

使用RxJava之前要在gradle中配置,这里要特别说明一下,retrofit 2.0对RxJava2的支持存在兼容性问题,会报出一个重复包的问题。

    @Override
    public void checkConfirmCode(final String deviceId, final String code, final OnAPIListener listener) {


        api.checkConfirmCode(deviceId, code)
                .flatMap(new Func1>() {
                    @Override
                    public Observable call(ConfirmCodeEntity entity) {
                        LogUtil.i("checkConfirmCode:"+entity.toString());

                        if("ok".equals(entity.getSuccess())){

                            listener.onSuccess(entity);

                            return null;
                        }

                        return api.checkEquPassword(deviceId, code);
                    }
                })
                .subscribeOn(Schedulers.newThread())//请求在新的线程中执行请求
                .observeOn(Schedulers.io())         //请求完成后在io线程中执行
                .doOnNext(new Action1() {
                    @Override
                    public void call(ConfirmPasswordEntity entity) {
                        LogUtil.i("doNext");
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())//观察者在UI线程,方便UI线程处理回调
                .subscribe(new Observer() {

                    @Override
                    public void onNext(ConfirmPasswordEntity entity) {
                        //完成一次完整的登录请求
                        LogUtil.i("checkConfirmCode onNext:"+entity.toString());
                        if("ok".equals(entity.getSuccess())){

                            final ConfirmCodeEntity confirmCodeEntity = new ConfirmCodeEntity();
                            confirmCodeEntity.setSuccess(entity.getSuccess());
                            confirmCodeEntity.setPlay_time(entity.getPlay_time());
                            confirmCodeEntity.setClient_id("");
                            confirmCodeEntity.setPay_id("");

                            listener.onSuccess(confirmCodeEntity);
                        }
                    }

                    @Override
                    public void onCompleted() {
                        LogUtil.i("checkConfirmCode onCompleted");
                    }

                    @Override
                    public void onError(Throwable error) {
                        //请求失败
                        LogUtil.i("checkConfirmCode onError:"+error.getMessage());
                    }

                });

    }

如果验证码接口返回成功,flatmap接口返回null,不执行下一个接口。否则执行验证服务码接口。
参考文章:
http://blog.csdn.net/jdsjlzx/article/details/52415615
http://www.jianshu.com/p/1fb294ec7e3b


你可能感兴趣的:(Android,总结,Android高性能编码)