之前看了很多关于MVP模式的简介,很多时候都是看完之后有很多疑惑,再或者是过几天就忘记了。今天突然有想起来了,然后又看了看定义,接着参照了一些demo,自己完整的将代码重新写了一边,使得印象更加深刻一点。
这个是我根据网上的一些demo(基本代码都是参照的一位大神的),然后根据自己的理解做出的demo(跟网上很多都是大同小异),希望在以后的项目开发中能够用的上。
这里界面也是一个登陆界面
这是我的代码分类
按照我自己的理解,首先我们需要定义出数据模型 LoginBean
,这里面主要是定义了一些我们界面所需的数据
public class LoginBean {
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String username;
private String password;
}
接下来我们需要定义我们登陆时的操作方法及需要调用的参数及监听接口
LoginBeanModle
public interface LoginBeanModle {
/**
* 登陆数据模块操作
*
* @param username
* @param password
* @param onLoginListener
*/
void login(String username, String password, OnLoginListener onLoginListener);
}
然后是登陆实体的实现代码,里面开启了一个线程(主要执行耗时操作)来发送登陆请求。
LoginModeImple
public class LoginModeImple implements LoginBeanModle {
@Override
public void login(final String username, final String password, final OnLoginListener onLoginListener) {
//开启一个线程执行耗时操作
new Thread() {
@Override
public void run() {
try {
//模拟从网络加载数据
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
if ("username".equals(username) && "password".equals(password)) {
LoginBean loginBean = new LoginBean();
loginBean.setUsername(username);
loginBean.setPassword(password);
onLoginListener.onSuccess(loginBean);
} else {
onLoginListener.onFailed();
}
}
}.start();
}
}
接下来,定义一个控制器,来对登陆操作之后的结果进行处理
LoginPresenter
public class LoginPresenter {
private LoginBeanModle loginBeanModle;
private LoginView loginView;
private Handler mHandler = new Handler();
public LoginPresenter(LoginView loginView) {
this.loginBeanModle = new LoginModeImple();
this.loginView = loginView;
}
public void login() {
//设置进度条可见
loginView.showLoading();
loginBeanModle.login(loginView.getUserName(), loginView.getPassword(), new OnLoginListener() {
@Override
public void onSuccess(final LoginBean loginBean) {
//在UI线程中执行
mHandler.post(new Runnable() {
@Override
public void run() {
loginView.userLogin(loginBean);
loginView.hideLoading();
}
});
}
@Override
public void onFailed() {
//在UI线程中执行
mHandler.post(new Runnable() {
@Override
public void run() {
loginView.showFailError();
loginView.hideLoading();
}
});
}
});
}
}
在界面显示上,我们还需要定义一个操作界面的接口
LoginView
public interface LoginView {
//获取用户名称
String getUserName();
//获取用户密码
String getPassword();
//登陆成功方法
void userLogin(LoginBean loginBean);
//登陆失败方法
void showFailError();
//显示加载进度条
void showLoading();
//隐藏加载进度条
void hideLoading();
}
最后,是我们在Activity中的实现
public class MainActivity extends Activity implements LoginView, View.OnClickListener {
private EditText edUseName;
private EditText edPassword;
private Button btnLogin;
private LoginPresenter loginPresenter = new LoginPresenter(this);
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
init();
}
private void init() {
edUseName = (EditText) findViewById(R.id.ed_username);
edPassword = (EditText) findViewById(R.id.ed_password);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
btnLogin = (Button) findViewById(R.id.btn_login);
btnLogin.setOnClickListener(this);
}
@Override
public String getUserName() {
return edUseName.getText().toString();
}
@Override
public String getPassword() {
return edPassword.getText().toString();
}
@Override
public void userLogin(LoginBean loginBean) {
Toast.makeText(this, getUserName() + "登陆成功", Toast.LENGTH_SHORT).show();
}
@Override
public void showFailError() {
Toast.makeText(this, getUserName() + "登陆失败", Toast.LENGTH_SHORT).show();
}
@Override
public void showLoading() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideLoading() {
progressBar.setVisibility(View.GONE);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
//控制层控制登陆操作
case R.id.btn_login:
loginPresenter.login();
break;
default:
break;
}
}
}
写这篇博客的目的只是为了加深自己对MVP模式的理解,因为看再多的代码,看再多的定义还不如自己手动敲代码来时记忆的更加深刻,理解的 更加透测。
利用MVP模式来设计项目架构,虽然代码量增加了很多,但是确实是View里面的代码变的更加精简了,对以后的代码维护肯定也会很方便。