一.mvp
1.m:model负责数据模型和页面逻辑
数据模型:用户javabean封装的数据
业务逻辑:包括登录的动作,登录的状态,登录的具体执行.
2.view,负责具体页面的展示
页面ui的展示:activity
进度条的展示
页面跳转的展示.
3.p:数据模型和view层的桥梁
通过接口来实现:prestener层对model层的封装,然后view层调用presenter层
二.代码实现
1.model层
数据模型:用户信息
public class User {
private String username;
private String password;
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;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User() {
}
}
登录动作
/**
* Model:登录业务逻辑
*
*/
public interface IUserLoginModel {
/**
* 登录业务逻辑
* @param username
* @param password
* @param listener
*/
void login(String username, String password, OnUserLoginListener listener);
}
登录状态
/**
* 用户登录回调接口
*/
public interface OnUserLoginListener {
/**
* 登录成功
* @param user
*/
void loginSuccess(User user);
/**
* 登录失败
*/
void loginFailed();
}
登录具体的执行
/**
* Model层,用户登录
*/
public class UserLoginModel implements IUserLoginModel{
@Override
public void login(final String username, final String password, final OnUserLoginListener listener) {
//模拟网络耗时操作
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(1500);
//登录业务逻辑
if("heima26".equals(username) && "123456".equals(password)){//登录成功
User user = new User(username, password);
listener.loginSuccess(user);
}else{//登录失败
listener.loginFailed();
}
}
}).start();
}
}
2.presenter层
/**
* Presenter层
* 1.p层既然起到桥梁的作用,p层必须持有model和view层对象(成员变量)
* 2.既然起到桥梁的左右,所以需要提供桥梁方法,当前的业务逻辑是登录,所以桥梁方法也是为了登录服务
*/
public class UserLoginPresenter implements OnUserLoginListener {
private IUserLoginModel userLoginModel;//model
private IUserLoginView userLoginView;//view
/**
* 两个参数的构造方法对吗?
* 如果是两个参数,p层是给View层调用的,说明activity持有model和view的对象,说明view和model连通了,不符合MVP架构
* 所以只能是一个参数构造方法
* @param userLoginModel
* @param userLoginView
*/
/* public UserLoginPresenter(IUserLoginModel userLoginModel, IUserLoginView userLoginView) {
this.userLoginModel = userLoginModel;
this.userLoginView = userLoginView;
}*/
/**
* 所以只能是一个参数构造方法
* @param userLoginView
*/
public UserLoginPresenter(IUserLoginView userLoginView) {
this.userLoginModel = new UserLoginModel();
this.userLoginView = userLoginView;
}
/**
* 沟通Model和view层的桥梁方法
*/
public void login(){
//1.登录(model),下面一行代码集中体现presenter层起到桥梁作用
userLoginModel.login(userLoginView.getUsername(), userLoginView.getPassword(),this);
//2.显示滚动条(View)
userLoginView.showProgressbar();
}
@Override
public void loginSuccess(final User user) {
mHandler.post(new Runnable() {
@Override
public void run() {
//1.隐藏滚动条
userLoginView.hideProgressbar();
//2.跳转主页
userLoginView.jump2Main(user);
}
});
}
@Override
public void loginFailed() {
mHandler.post(new Runnable() {
@Override
public void run() {
//1.隐藏滚动条
userLoginView.hideProgressbar();
//2.提示用户登录失败
userLoginView.showLoginError();
}
});
}
private Handler mHandler = new Handler();
}
3.view层
ui方法的封装共p层调用
/**
* View层,如何实现View层,View层是最复杂的一层
* 1.有什么操作:获取用户名、获取密码
* 2.有什么用户交互:显示滚动条、隐藏滚动条
* 3.有什么结果:登录成功跳转主页、登录失败提示用户
*/
public interface IUserLoginView {
/**获取用户名*/
String getUsername();
/**获取密码*/
String getPassword();
/**显示滚动条*/
void showProgressbar();
/**隐藏滚动条*/
void hideProgressbar();
/**登录成功跳转主页*/
void jump2Main(User user);
/**登录失败提示用户*/
void showLoginError();
}
view具体
public class LoginActivityMVP extends Activity implements OnClickListener,IUserLoginView{
private EditText etUsername;
private EditText etPassword;
private ProgressBar progressBar;
private Context context;
private Button btnLogin;
private UserLoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity_mvp);
context = this;
initViews();
btnLogin.setOnClickListener(this);
}
private void initViews() {
etUsername = (EditText) findViewById(R.id.et_username);
etPassword = (EditText) findViewById(R.id.et_password);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
btnLogin = (Button) findViewById(R.id.btnLogin);
presenter = new UserLoginPresenter(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnLogin:
presenter.login();
break;
}
}
@Override
public String getUsername() {
return etUsername.getText().toString().trim();
}
@Override
public String getPassword() {
return etPassword.getText().toString().trim();
}
@Override
public void showProgressbar() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgressbar() {
progressBar.setVisibility(View.GONE);
}
@Override
public void jump2Main(User user) {
Toast.makeText(LoginActivityMVP.this, "登录成功,跳转主页~~~", Toast.LENGTH_SHORT).show();
}
@Override
public void showLoginError() {
Toast.makeText(LoginActivityMVP.this, "用户名或者密码错误,登录失败~~~", Toast.LENGTH_SHORT).show();
}
}