前言
上一篇文章,主要介绍了MVC、MVP、MVVM三种模式,这篇文章里主要用MVP模式实现一个登录模块,这个是我以前项目了用到的。
先看下面的效果图。
源码下载:https://github.com/baojie0327/SsrjMvp
为了表述的更清楚一些,我就以MVP的三个部分,Model,View,Presenter三个部分介绍代码吧。
View模块--界面
- 首先要偶遇个IView的类,存放各个模块的IView的接口。当然,你也可以不把接口放在一个类里,可以单独写一个接口,但是那样,接口的数量会增多。
public class IView {
/**
* 登录
*/
public interface ILoginView {
String getUserName();
String getPassWord();
void showToast(String content);
void closeDispose(Disposable disposable);
void showProgress();
void hideProgress();
void toOtherActivity();
}
}
这个接口的方法数应根据界面上的逻辑处理,目前登录功能,界面上的处理主要是获取账号,密码两个EditText输入的数据,显示和隐藏ProgressBar,登录过程中的Toast提示,登录成功会后跳到别的界面,其中,closeDispose()方法是因为用到了RxJava2,需要在页面销毁时关闭Dispose
- LoginActivity要实现这个接口,实现ILoginView里定义的方法。
public class LoginActivity extends BaseActivity implements IView.ILoginView {
}
Model模块--数据
- 同样,也有一个IModel的类,存放各个模块的IModel的接口,当然也可以每个模块单独写一个接口,不过那样接口的数据会增多。登录模块的数据操作定义在这个接口里,这里只是执行了一个登录操作。
public class IModel {
/**
* 登录
*/
public interface ILoginModel {
void login(LoginBody loginBody, MyCallBack<UserLoginBean> callBack); //登录
}
}
- 登录模块的LoginModel方法,继承自IModel里的对应接口,里面实现具体的数据逻辑,这里只有一个方法是登录,用的是Retrofit+Rxjava2,具体可以参照源码。
public class LoginModel implements IModel.ILoginModel {
@Override
public void login(LoginBody loginBody, final MyCallBack<UserLoginBean> callBack) {
JsNetworkService.getInstance().getIJsNetworkService()
.getLogin(loginBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UserLoginBean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Disposable mDisposable; //用于Activity销毁时停止执行
mDisposable = d;
callBack.onDispose(mDisposable);
}
@Override
public void onNext(@NonNull UserLoginBean userLoginBean) {
callBack.onSuccess(userLoginBean);
}
@Override
public void onError(@NonNull Throwable e) {
callBack.onError("Server Error", "服务器异常,请稍后再试");
}
@Override
public void onComplete() {
}
});
}
}
Presenter模块
当然,这是VIew模块和Model模块的联系的桥梁了。
public class LoginPresenter {
private IView.ILoginView mILoginView;
private LoginModel mLoginModel;
public LoginPresenter(IView.ILoginView iLoginView) {
this.mILoginView = iLoginView;
mLoginModel = new LoginModel();
}
/**
* 登录
*/
public void login() {
/* Map<String, String> paraMap =new HashMap<>();
paraMap.put("userName",mILoginView.getUserName());
paraMap.put("passWord",mILoginView.getPassWord());*/
mILoginView.showProgress();
LoginBody loginBody = new LoginBody(mILoginView.getPassWord(), mILoginView.getUserName());
mLoginModel.login(loginBody, new MyCallBack<UserLoginBean>() {
@Override
public void onSuccess(UserLoginBean userLoginBean) {
mILoginView.hideProgress();
if (userLoginBean.getStatus().equals("1")) {
mILoginView.toOtherActivity();
}
mILoginView.showToast(userLoginBean.getMessage());
}
@Override
public void onError(String header, String message) {
mILoginView.hideProgress();
mILoginView.showToast(message);
}
@Override
public void onDispose(Disposable disposable) {
mILoginView.closeDispose(disposable);
}
});
/* mLoginModel.login(loginBody, new MyCallBack.OnLoginListener() {
@Override
public void loginSuccess(UserLoginBean userLoginBean) {
mILoginView.showToast(userLoginBean.getMessage());
}
@Override
public void loginFailed(String header, String message) {
}
@Override
public void dispose(Disposable disposable) {
mILoginView.closeDispose(disposable);
}
});*/
}
private Map<String, String> createParaMap() {
Map<String, String> paraMap = new HashMap<>();
paraMap.put("userName", mILoginView.getUserName());
paraMap.put("passWord", mILoginView.getPassWord());
return paraMap;
}
}
在Activity中,点击登录按键,会调用LoginPresenter的login()方法,这样View就通知到Presenter更新数据,在Presenter的login()方法里,会调用到Model层的login()方法,真正的去请求数据,请求完成后通过回调,反映到Presenter里面,Presenter在通知到View层数据变了,界面更新,这里的界面更新主要是ProgressBar的显示隐藏,Toaast显示提示信息,登录成功后跳到别的页面。
/**
* 登录
*/
@OnClick(R.id.btn_login)
public void login() {
if (TextUtils.isEmpty(getUserName())) {
mTlUsername.setErrorEnabled(true);
mTlUsername.setError("账号不能为空");
} else if (!validatePassword(getPassWord())) {
mTlPassword.setErrorEnabled(true);
mTlPassword.setError("密码字数过少");
} else {
mLoginPresenter.login();
}
}
一个简单的登录模块的mvp模式就实现了,具体可以参照代码
https://github.com/baojie0327/SsrjMvp
网友评论