欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-14 10:03:58
...

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

1.ForgetPresenter的书写

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

public class ForgetPresenter extends ForgetContract.Presenter {


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

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

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

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

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

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

public abstract class BaseActivity<T extends BasePresenter, E extends BaseModel> extends RxBaseActivity<T, E> {
    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<String, String> getLoginDataInfo(String userName, String userPwd) {
        Map<String, String> 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<String, String> getSendCodeInfo() {
        Map<String, String> map = new HashMap<>();
        return map;
    }


    public static Map<String, String> getCheckCodeInfo() {
        Map<String, String> 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书写完毕,我们就可以按部就班的将其他的内容轻松写好。

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

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

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