一 .Mvp的基础:
View 对应于Activity,负责View的绘制以及与用户交互Model 依然是业务逻辑和实体模型Presenter 负责完成View于Model间的交互
MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的(代码中会体现)。
代码例子:
/**
* 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{
//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); // new presenter的对象,调用方法
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnLogin:
presenter.login(); //--->调用login方法,是presenter实现了OnUserLoginListener的接口; presenter中有view和model的引用,而model又实现了IUserLoginModel ————>void login(String username, String password, OnUserLoginListener listener); break; }
}
//对接口方法的具体实现,这个接口主要处理的是view的具体变化
@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();
}
} //Presenter 处理view和model的交互类,中间作为1个关系的对接链,即把的到view传递过来的数据,传递到Model进行处理,又把Model处理后的结果通过Presenter返回给view进行变化;/**
* 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();
}
/**
* 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();
}
}
/**
* 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();
}
转载请注明原文地址: https://ju.6miu.com/read-39546.html