Android 从零搭建简单MVP Demo
首先简单介绍一下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的更多相关文章
- idea从零搭建简单的springboot+Mybatis
需用到的sql /* Navicat MySQL Data Transfer Source Server : localhost root Source Server Version : 80012 ...
- PhoneGap开发的android项目环境搭建简单流程
首先已经下载好最新的PhoneGap源代码. 已经装eclipse,android sdk及adt的安装和配置. 1.进入eclipse界面,新建android工程 new > androi ...
- Dubbo入门—搭建一个最简单的Demo框架
一.Dubbo背景和简介 1.电商系统的演进 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. a.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一 ...
- Dubbo入门---搭建一个最简单的Demo框架(转)
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- Dubbo简介---搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建
SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...
- 基于Idea从零搭建一个最简单的vue项目
一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
随机推荐
- 网络基础一 交换机 路由器 OSI7层模型
第1章 网络基础 1.1 网络的出现 解决计算机通讯的需求 实现计算机信息可以传递 1.2 主机之间实现通讯基本要求(三要素) ①. 需要在两台主机之间建立物理连接,物理连接的方式有网线 光纤线 wi ...
- hive的简单理解--笔记
Hive的理解 数据仓库的工具 Hive仅仅是在hadoop上面包装了SQL: Hive的数据存储在hadoop上 Hive的计算由MR进行 Hive批量处理数据 Hive的特点 1 可扩展性(h ...
- Android 开发笔记___基本适配器的使用__BaseAdapter
之前用到过ArryAdapter适用于纯文本的列表数据,SimpleAdapter适用于带图标的列表数据,但在实际应用中常常有更复杂的列表,比如同一项中存在多个控件,这时候用前面的两个会比较复杂,而且 ...
- http 状态
用户如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求.此状态 ...
- linux-rmdir
linux-rmdir rmdir命令用于删除空目录,删除的目录的里面必须无任何东西,有点鸡肋的命令 从下面先建立了一个a文件夹. 命令: rmdir a,即可删除这个空目录,ls 就找不到这个文件夹 ...
- Python一个命令开启http下载服务器(可以局域网内共享文件)
前提条件:windows系统上安装python 如果想把D:\asdm作为提供下载的目录, 打开cmd然后cd命令进入该目录:cd D:\asdm, 然后执行Python -m SimpleHTTPS ...
- flask中使用xlsxwriter导出excel文件
最近需要使用flask导出xlsxwriter生成的excel文件,在文件比较小的情况下,可以直接导出. 首先,这里使用了StringIO,导出使用的模块 import xlsxwriter impo ...
- Java中的Redis应用
1.配置redis集群 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0" encoding ...
- javaweb学习方案1
一.JAVA环境变量的配置1.首先下载JDK JDK可以在Oracle(甲骨文)公司的官方网站http://www.oracle.com下载2.安装完成后查看JDK安装路径一般是C:\Program ...
- 熊掌号:"搜索+信息流"双引擎与"百家号+熊掌号"双品牌内容平台
一. 熊掌号是什么?熊掌号简单来说,就是"搜索 + 信息流"双引擎与"百家号 + 熊掌号"双品牌内容平台,上线了,对站长还是企业,都是一件好事.只要写出优质的原 ...