Android开发,ZxMvp框架的引入及使用详解(下)

上一章:Android开发,ZxMvp框架的引入及使用详解(中)

1.ForgetPresenter的书写

上一章我们已经把ForgetModel、ForgetContract写好了,现在我们开始写ForgetPresenter

public class ForgetPresenter extends ForgetContract.Presenter {


    @Override
    public void doSendCode(Map map) {
        mModel.sendCodeData(map)
                .compose(RxHelper.bindToLifecycle(mView))
                .subscribe(new RxSubscriber(mView) {
                    @Override
                    protected void _onNext(String s) {
                        if(s.equeals("true"))mView.onSendCodeResult();//随意写的判断
                    }

                    @Override
                    protected void _onError(String message) {
                        mView.showToast(message);
                    }
                });
    }

    @Override
    public void doCheckCode(Map map) {
        mModel.checkCodeData(map)
                .compose(RxHelper.bindToLifecycle(mView))
                .subscribe(new RxSubscriber(mView) {
                    @Override
                    protected void _onNext(CodeEntity codeEntity) {
                        mView.onCheckCodeResult(codeEntity);
                    }

                    @Override
                    protected void _onError(String message) {
                        mView.showLoading(message);
                    }
                });
    }
}

如上所示,mModel先请求数据,然后绑定生命周期,最后得出返回值。

我们来看不同,上面的sendcode,我们在onnext中拿到了一个string类型的参数。

下面的checkCode我们拿到了一个CodeEntity的参数。

由于上面的发送验证码,我们没有使用BaseResponse+RxHelper的方式,所以虽然我们请求成功了,我们也并不知道请求结果是否为true。

我们就需要从String中去判断,判断里面的Success是否为1。如果成功我们再返回回去

下面的checkCode,我们使用了BaseResponse+RxHelper的方式,所以我们如果走到onnext这一步,就说明我们不仅请求完成了,我们的请求结果还是true,也就是success我们框架已经判断结束,他就是1了。我们可以直接把codeEntity传回去,就无需再次判断了。

另外我们的网络请求使用的是Retrofit。我们如果遇到连续请求,即先调用接口A,然后拿到接口A的返回结果,再拿这个结果作为接口B的参数来进行请求我们可以这样写。

@Override
    public void doSendCode(Map map) {
        mModel.sendCodeData(map)
                .flatMap(new Func1>() {
                    @Override
                    public Observable call(String s) {
                        mView.onSendCodeResult();
                        return mModel.checkCodeData(map);
                    }
                })
                .compose(RxHelper.bindToLifecycle(mView))
                .subscribe(new RxSubscriber(mView) {
                    @Override
                    protected void _onNext(CodeEntity s) {
                        mView.onSendCodeResult();
                    }

                    @Override
                    protected void _onError(String message) {
                        mView.showToast(message);
                    }
                });
    }

这里我就不讲太多了,有需要的可以去学习Retrofit的使用方法。

这里最后一个需要注意的地方如下:

Android开发,ZxMvp框架的引入及使用详解(下)_第1张图片

这个位置,可以传入一个mView,也可以不传,如果传入了,那么开始请求的显示dialog和结束请求的取消dialog框架都可以帮你处理。这这里的dialog的方法调用的是BaseActivity或者BaseFragment里面的方法。

public abstract class BaseActivity extends RxBaseActivity {
    public ZXSharedPrefUtil mSharedPrefUtil = new ZXSharedPrefUtil();
    public Handler handler = new Handler();


    @Override
    public void showToast(String message) {
        ZXToastUtil.showToast(message);
    }

    @Override
    public void showLoading(String message) {
        ZXDialogUtil.showLoadingDialog(this, message);
    }

    @Override
    public void dismissLoading() {
        ZXDialogUtil.dismissLoadingDialog();
    }

}

而这里我默认的调用的ZxUtils里面的dialog。你们如果有需要可以改成自己的方法。

2.FoegetActivity的书写

下面就是最后一个地方了。view层的书写。

首先,我们知道我们发送验证码,和检查验证码都是两个按钮的点击事件。

@OnClick({R.id.back_bt, R.id.btn_next})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.back_bt:
                mPresenter.doSendCode(ApiParamUtil.getSendCodeInfo());
                break;
            case R.id.btn_next:
                mPresenter.doCheckCode(ApiParamUtil.getCheckCodeInfo());
                break;
        }
    }
这里用到了注解,我不仔细讲了。

主要看我们开始请求的方法。

mPrenster.doSendCode()

这里我们调用了presenter里面的发送验证码的接口。

这个接口我们需要传入一个map进去,我这里用了ApiParamsUtil进行了封装,如下:

public class ApiParamUtil {

    //登录
    public static Map getLoginDataInfo(String userName, String userPwd) {
        Map map = new HashMap<>();
        map.put("sys_type", "member");
        map.put("Account", userName);
        map.put("phone", userName);
        map.put("loginPwd", userPwd);
        return map;
    }

    public static Map getSendCodeInfo() {
        Map map = new HashMap<>();
        return map;
    }


    public static Map getCheckCodeInfo() {
        Map map = new HashMap<>();
        return map;
    }


}
这里的登录,是我举的例子。大家明白使用方法即可。

好的,开始请求就已经完成了。

接下来就是拿到结果。

因为我们在ForgetContract的View接口中写了两个方法,这里我们需要实现一下。

    @Override
    public void onSendCodeResult() {
        showToast("验证码已发送");
//        LoginActivity.startAction(this,true, "test",false);
    }

    @Override
    public void onCheckCodeResult(CodeEntity codeEntity) {
        //这里确认验证成功了  就可以跳转到改密码界面了
    }
如上,这里我们就已经拿到了结果了,在这里我们就可以执行我们想要的操作了。
至此,我们的一套流程就算结束了。

相比起以前的mvc我们不难发现,mvp中进行一个请求真的麻烦的不是一点半点。

但是我们也能看到,mvp中每个模块都各行其是,代码一路了然。只要将contrct书写完毕,我们就可以按部就班的将其他的内容轻松写好。

在以后遇到修改的时候,也能很快的完成修改。

到此差不多就结束了,如果各位在使用中遇到了什么问题,欢迎提出来。

另外如果对框架有修改意见,也欢迎提出来,我会尽快进行修改。












你可能感兴趣的:(Android基础开发)