首先简单介绍一下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

Android 从零搭建简单MVP Demo的更多相关文章

  1. idea从零搭建简单的springboot+Mybatis

    需用到的sql /* Navicat MySQL Data Transfer Source Server : localhost root Source Server Version : 80012 ...

  2. PhoneGap开发的android项目环境搭建简单流程

      首先已经下载好最新的PhoneGap源代码. 已经装eclipse,android sdk及adt的安装和配置. 1.进入eclipse界面,新建android工程 new > androi ...

  3. Dubbo入门—搭建一个最简单的Demo框架

    一.Dubbo背景和简介 1.电商系统的演进 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. a.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一 ...

  4. Dubbo入门---搭建一个最简单的Demo框架(转)

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本.  ...

  5. Dubbo简介---搭建一个最简单的Demo框架

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本.  ...

  6. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  7. Dubbo入门介绍---搭建一个最简单的Demo框架

    Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...

  8. 基于Idea从零搭建一个最简单的vue项目

    一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...

  9. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

随机推荐

  1. sersync实现数据实时同步

    1.1 第一个里程碑:安装sersync软件 1.1.1 将软件上传到服务器当中并解压 1.上传软件到服务器上 rz -E 为了便于管理上传位置统一设置为 /server/tools 中 2.解压软件 ...

  2. FTP配置的一些笔记

    1.必须关闭防火墙 iptables -F iptables -X iptables -Z vi /etc/selinux/config          SELINUX=disabled seten ...

  3. Javascript数组求和的方法总结 以及由斐波那契数列得到的启发

    一次面试中,面试官要求用三种不同的Javascript方法进行一个数字数组的求和,当时思来想去只想到了使用循环这一种笨方法,因此面试比较失败,在这里总结了六种Javascript进行数组求和的方法,以 ...

  4. PLSQL锁表之后改如何操作

    (1)查看哪个表被锁select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects ...

  5. JS事件流(W3C与IE区别)

    一.JS事件的3个阶段:捕获.目标.冒泡,低版本IE不支持捕获阶段: 二.在浏览器解析事件的时候,有两种触发方式:一种叫做Bubbling(冒泡),另外一种叫做Capturing(捕获). 冒泡的方式 ...

  6. Java多线程学习之线程池源码详解

    0.使用线程池的必要性 在生产环境中,如果为每个任务分配一个线程,会造成许多问题: 线程生命周期的开销非常高.线程的创建和销毁都要付出代价.比如,线程的创建需要时间,延迟处理请求.如果请求的到达率非常 ...

  7. Java多线程学习之ThreadLocal源码分析

    0.概述 ThreadLocal,即线程本地变量,是一个以ThreadLocal对象为键.任意对象为值的存储结构.它可以将变量绑定到特定的线程上,使每个线程都拥有改变量的一个拷贝,各线程相同变量间互不 ...

  8. 自动化之路 python psutil模块 收集硬件信息

    一.psutil模块 1. psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控,分析和限制系统资源及进程的管理.它实现了 ...

  9. 【魅族Pro7】——BootStrap/JQuery/Canvas/PHP/MySQL/Ajax爬坑之项目总结(一)

    前言:这个项目是我们小组团体合作完成的学习项目,项目使用魅族GUI设计和图片素材,响应式重构Pro7官网的首页.子页.商城及购物车,并加入一些创新.我主要负责的是[画屏子页]的项目,这里作为温故知新, ...

  10. 2964:日历问题-poj

    2964:日历问题 总时间限制:  1000ms 内存限制:  65536kB 描述 在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰 ...