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

来源:互联网 发布:mac电脑游戏推荐 编辑:程序博客网 时间:2024/06/03 23:43

上一章: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的使用方法。

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


这个位置,可以传入一个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书写完毕,我们就可以按部就班的将其他的内容轻松写好。

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

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

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












阅读全文
0 0