首先简单介绍一下MVP的构成及优缺点:

MVP的全称为Model-View-Presenter,

Model提供数据(网络请求、数据存储等);

View负责页面显示;

Presenter负责逻辑的处理;

优点:主要就是将Model层和View层完全解耦,使得两者任一方的修改都不会对另一方产生影响,而是将逻辑处理放在了Presenter层;

缺点:显而易见,随着项目的增大,Presenter层也会变得臃肿,所以根据不同项目逻辑灵活的去使用Presenter也很重要;

之前有做过基于MVP的Android项目,根据别人写好的结构,无非就是填充代码,对于MVP整体的理解不够到位,所以该如何从头去理解一个MVP项目,对今后避免一些逻辑错误也是至关重要的。

下面我会以简单的登录模块为例,结合具体代码将整个MVP分步来构建,以便更好的去理解MVP,有需要的可以将完整demo去文末clone下来。

1.定义View层接口

public interface LoginView {
void showProgress();
void hideProgress();
void loginSuccess();
void loginFail();
}

2.LoginActivity实现View接口,基本页面布局就不一一展示了,只附上关键代码

LoginActivity ->

  @Override
public void showProgress() {
mWaitLogin.setVisibility(View.VISIBLE);
} @Override
public void hideProgress() {
mWaitLogin.setVisibility(View.GONE);
} @Override
public void loginSuccess() {
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
//登录成功,跳转到主页面
} @Override
public void loginFail() {
Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
//登录失败,停留在登录页面
}

3.定义Model接口

public interface LoginModel {
interface OnLoginListener {
void onLoginSuccess(); void onLoginFail();
} void login(String username, String password, OnLoginListener listener);
}

4.实现Model接口,模拟登录请求

public class LoginModelImpl implements LoginModel {
@Override
public void login(final String username, final String password, final OnLoginListener listener) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (username.equals("1") && password.equals("1")) {
listener.onLoginSuccess();
} else {
listener.onLoginFail();
}
}
}, 3000);
}
}

5.这时我们需要知道,在LoginActivity中点击登录后,需要通过Presenter去控制Model来执行具体登录操作,所以接下来定义Presenter接口

public interface LoginPresent {
void doLogin(String username, String password);
}

6.实现Presenter接口及登录监听接口并编写具体的逻辑

public class LoginPresentImpl implements LoginPresent,LoginModel.OnLoginListener{
private LoginView mView;
private LoginModel mModel; public LoginPresentImpl(LoginView view, LoginModel model) {
mView = view;
mModel = model;
}
@Override
public void doLogin(String username,String password) {
mView.showProgress();
mModel.login(username, password, this);
} @Override
public void onLoginSuccess() {
mView.hideProgress();
mView.loginSuccess();
} @Override
public void onLoginFail() {
mView.hideProgress();
mView.loginFail();
}
}

7.在LoginActivity中控制Presenter去进行登录处理

mPresent = new LoginPresentImpl(this, new LoginModelImpl());

        mLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String username = mUserName.getText().toString().trim();
String password = mPassword.getText().toString().trim();
//简单进行非空验证
if (username != null && !username.equals("") && password != null && !password.equals("")) {
//这里想要执行登录操作,需要通过Present控制Model请求
mPresent.doLogin(username, password);
} else {
Toast.makeText(LoginActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
} }
});

麻雀虽小,五脏俱全,这样一个完整的MVP模式就一步一步构建出来了。

demo链接:https://github.com/wangpeng0531/MyMVP.git

最新文章

  1. CentOS 7 安装RabbitMQ 3.3
  2. [Django]数据批量导入
  3. eclipse中java项目的build path详解
  4. Android SeekBar自定义使用图片和颜色显示
  5. eclipse集成maven
  6. Android 珍藏(二)
  7. Java用链表实现栈和队列
  8. 关于bootstrap--表格(tr的各种样式)
  9. SharePoint网站集功能介绍
  10. CentOS 6.5玩转自制Linux、远程登录及Nginx安装测试
  11. C#数组和元组
  12. 【小错误】WPF代码报错:未将对象引用设置到对象的实例。
  13. ubuntu16.04 离线安装nginx
  14. ZOJ 3795 Grouping (强连通缩点+DP最长路)
  15. HDU1007.Quoit Design
  16. Qt Widgets——主窗口及其主要组成部分
  17. 【NOIP 2018】填数游戏(思考与推导)
  18. 任务四十二:UI组件之日历组件(三)
  19. 判断单选框选中不成功,$("#xx").attr("checked")undefined
  20. Qt 将字符串转成16进制显示

热门文章

  1. 交换知识 VLAN VTP STP 单臂路由
  2. Day1作业-模拟登录
  3. js获取浏览器版本
  4. Web桌面应用框架3:Web桌面应用开发的N种Style
  5. 14.javaweb AJAX技术详解
  6. AutoMapper IIS回收引发的 未将对象引用设置到对象实例
  7. 非对称加密技术- RSA算法数学原理分析
  8. C#编程命名规范推荐
  9. python基础-------函数(三)
  10. ecshop添加菜单以及权限分配