上一章:Android开发,ZxMvp框架的引入及使用详解(中)
上一章我们已经把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);
}
});
}
}
我们来看不同,上面的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);
}
});
}
这里最后一个需要注意的地方如下:
这个位置,可以传入一个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();
}
}
下面就是最后一个地方了。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书写完毕,我们就可以按部就班的将其他的内容轻松写好。
在以后遇到修改的时候,也能很快的完成修改。
到此差不多就结束了,如果各位在使用中遇到了什么问题,欢迎提出来。
另外如果对框架有修改意见,也欢迎提出来,我会尽快进行修改。