Android -- 初探MVP模式
1,相信大家对mvp模式都很熟悉了,M-Model-模型、V-View-视图、C-Controller-控制器。MVP作为MVC的版本演化,与MVC的意义类似:M-Model-模型、V-View-视图、P-Presenter-表示器。从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用。而 MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互。在 Android中很重要的一点就是对UI的操作基本上需要异步进行也就是在MainThread中才能操作UI,所以对View与Model的切断分离是 合理的。此外Presenter与View、Model的交互使用接口定义交互操作可以进一步达到松耦合也可以通过接口更加方便地进行单元测试。下面是对应的两张图(左图为mvc,右图为mvp):

可以看到最明显的区别是mvc是允许model和view交互的,而mvp中model和view中的交互是由presenter完成的,presenter和view的交互是通过接口来实现的。
2,mvp的实现应用 (例子是大神博客写的,自己只是拿过来来写一下实现的思路,毕竟还是小菜鸟的级别)
先看一下要实现的效果:

再看一下我们工程的目录:

由我们上面的功能需要可以看出,这是一个最常见的登录功能,所以首先我们要创建一个User类,,包含用户名和密码,用于对应用户输入的用户信息
① Model层
User.java
package com.wangjitao.simplelogindemo.bean; /**
* Created by wangjitao on 2016/5/12.
* 用户登录bean
*/
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;
}
}
从上面所给的功能可以看出我们主要是要实现登录功能的,所以至少有一个login()方法
IUserBIZ.java
package com.wangjitao.simplelogindemo.inter; import com.wangjitao.simplelogindemo.listener.OnLoginListener; /**
* Created by wangjitao on 2016/5/12.
*/
public interface IUserBIZ {
public void login(String username ,String password ,OnLoginListener loginListener);
}
它的实现类 UserBIZ.java ,在实现类中我们模拟一个登陆的耗时操作,然后在登录成功的写了一个回调类OnLoginListener.java
UserBIZ.java
package com.wangjitao.simplelogindemo.inter; import com.wangjitao.simplelogindemo.bean.User;
import com.wangjitao.simplelogindemo.listener.OnLoginListener; /**
* Created by jh on 2016/5/12.
*/
public class UserBIZ implements IUserBIZ{ @Override
public void login(final String username, final String password, final OnLoginListener loginListener) {
//开启子线程模拟登录耗时操作
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//模拟登录成功
if("wjt".equals(username) && "123456".equals(password)){
User user = new User();
user.setUsername(username);
user.setPassword(password);
loginListener.loginSuccess(user);
}else {
loginListener.loginFailed();
}
}
}.start();
}
}
OnLoginListener.java
package com.wangjitao.simplelogindemo.listener; import com.wangjitao.simplelogindemo.bean.User; /**
* Created by wangjitao on 2016/5/12.
*/
public interface OnLoginListener {
void loginSuccess(User user) ;
void loginFailed();
}
②View 层
从我们看到的界面我们可以看到,用户一共有两个按钮,一个是login,那么需要两个方法来获取用户名和密码
String getUserName();
String getPassword();
然后是一个clear按钮,这时候我们要提供两个方法去清空输入框的内容
void clearUserName();
void clearPassword();
然后当用户正在登陆的时候,我们需要一个用户的等待,这时候我们需要加一个进度的提示条
void clearUserName();
void clearPassword();
然后是用户登录后的一些提示,当登陆成功,让用户跳转到下一个界面,当登录失败提示用户用户名或密码错误
void toMainActivity(User user);
void showFailedError();
所以view的接口如下:
package com.wangjitao.simplelogindemo.view; import com.wangjitao.simplelogindemo.bean.User; /**
* Created by jh on 2016/5/12.
*/
public interface IUserLoginView {
String getUserName();
String getPassword(); void showLoading();
void dismissLoading(); void toMainActivity(User user);
void showFailedError(); void clearUserName();
void clearPassword(); }
然后Activity来实现这个接口的方法(Activity也可以当做一个view层)
package com.wangjitao.simplelogindemo; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast; import com.wangjitao.simplelogindemo.bean.User;
import com.wangjitao.simplelogindemo.presenter.UserLoginPresenter;
import com.wangjitao.simplelogindemo.view.IUserLoginView; public class MainActivity extends AppCompatActivity implements IUserLoginView{
private EditText editText_username ,editText_password ;
private Button button_login ,button_clean ;
private ProgressBar progressBar ; private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView();
} private void initView() {
editText_username = (EditText)findViewById(R.id.editText_username);
editText_password = (EditText)findViewById(R.id.editText_password); button_login = (Button)findViewById(R.id.button_login);
button_clean = (Button)findViewById(R.id.button_clean); progressBar = (ProgressBar)findViewById(R.id.progressBar); button_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUserLoginPresenter.login();
}
}); button_clean.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUserLoginPresenter.clear();
}
});
} @Override
public String getUserName() {
return editText_username.getText().toString();
} @Override
public String getPassword() {
return editText_password.getText().toString();
} @Override
public void showLoading() {
progressBar.setVisibility(View.VISIBLE);
} @Override
public void dismissLoading() {
progressBar.setVisibility(View.GONE);
} @Override
public void toMainActivity(User user) {
Toast.makeText(MainActivity.this ,"登录成功:欢迎回来"+user.getUsername(),Toast.LENGTH_SHORT).show();
} @Override
public void showFailedError() {
Toast.makeText(MainActivity.this ,"登录失败",Toast.LENGTH_SHORT).show();
} @Override
public void clearUserName() {
editText_username.setText("");
} @Override
public void clearPassword() {
editText_password.setText("");
}
}
③Persenter
这个用与处数据和视图的交互,我们的这个应用主要是login和clear ,所以代码如下:
package com.wangjitao.simplelogindemo.presenter; import android.os.Handler; import com.wangjitao.simplelogindemo.bean.User;
import com.wangjitao.simplelogindemo.inter.IUserBIZ;
import com.wangjitao.simplelogindemo.inter.UserBIZ;
import com.wangjitao.simplelogindemo.listener.OnLoginListener;
import com.wangjitao.simplelogindemo.view.IUserLoginView; /**
* Created by wangjitao on 2016/5/12.
*/
public class UserLoginPresenter {
private IUserBIZ userBIZ ;
private IUserLoginView userLoginView ;
private Handler mHandler = new Handler(); public UserLoginPresenter(IUserLoginView userLoginView){
this.userLoginView = userLoginView ;
userBIZ = new UserBIZ();
} public void login(){
userLoginView.showLoading();
userBIZ.login(userLoginView.getUserName(), userLoginView.getPassword(), new OnLoginListener() {
@Override
public void loginSuccess(final User user) {
mHandler.post(new Runnable() {
@Override
public void run() {
userLoginView.toMainActivity(user);
userLoginView.dismissLoading();
}
});
} @Override
public void loginFailed() {
mHandler.post(new Runnable() {
@Override
public void run() {
userLoginView.showFailedError();
userLoginView.dismissLoading();
}
});
}
});
} public void clear(){
userLoginView.clearUserName();
userLoginView.clearPassword();
}
}
Presenter大致就是从View中获取需要的参数,交给Model去执行业务方法,执行的过程中需要的反馈,以及结果,再让View进行做对应的显示。
这样我们的demo就写完了 ,感觉还是很有成就感的嘛。
Android -- 初探MVP模式的更多相关文章
- Android开发MVP模式解析
http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...
- android的MVP模式
MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...
- 说说Android的MVP模式
http://toughcoder.NET/blog/2015/11/29/understanding-Android-mvp-pattern/ 安卓应用开发是一个看似容易,实则很难的一门苦活儿.上手 ...
- Android开发 MVP模式的规范记录(个人总结)
前言 首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不 ...
- android中MVP模式(一) - 清风明月的专栏 - CSDN博客
presenter 主持人.主导器 ====== 1. 明确需求,界面如下:可存,可根据id读取数据. 包结构图 2. 建立bean public class UserBean { private S ...
- Android中MVP模式与MVC模式比較(含演示样例)
原文链接 http://sparkyuan.me/ 转载请注明出处 MVP 介绍 MVP模式(Model-View-Presenter)是MVC模式的一个衍生. 主要目的是为了解耦,使项目易于维护. ...
- ym——Android开发MVP模式(攻克了View和Model的耦合)
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 什么是MVP呢?它又和我们经常听到的MVC有什么关系了以及差别呢? MVP 是从经典的 ...
- Android之MVP模式实现登录和网络数据加载
MVP简介 相信大家对 MVC 都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,也是作为用户界面(用户层)的实现模式,那么类似的 ...
- (未完成)【Android】MVP模式初见(一)
最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意. 虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近.因此接下来一段时间,主要学习一下MVP架构.Retrofit以及RxJav ...
随机推荐
- 0011 SDK测试方法&ADB语法
h1.移动云OSS SDK测试方法,包含环境搭建 android oss sdk 测试方法 1. 搭建测试环境 1. A ndroid模拟器需要jdk1.6 2. ...
- C#调用NPOI组件导出Excel表格
把一个List集合的数据导出到Excel表格中 public static string RenderToExcel<T>(List<T> datas) { MemoryStr ...
- Nodejs电影建站开发实例(下)
作为一个真正的网站,不能没有数据的支持,下面使用的数据库为mongodb,电影可能有的数据:电影名称.导演.国家.语言.上映时间.图片.简介.视频 4.使用路由 app.js var express ...
- jQuery动态对表格Table进行添加或删除行以及修改列值操作
jQuery,不仅可以以少量的代码做很多操作,而且兼容性好(各种浏览器,各种版本). 下面用jQuery动态对表格Table进行添加或删除行以及修改列值操作 1.jQuery代码 <script ...
- win2008主机IIS7.x 关于web.config设置301重定向
win2008主机IIS7.x 关于web.config设置301重定向 要求:windows主机是IIS7.0或以上的版本 方法如下: 在网站的根目录下新建web.config文件并将一下代码加入到 ...
- java 获取请求客户端的真实IP地址
转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr();方法获取的IP地址是:127.0.0.1或192.16 ...
- 详解js变量、作用域及内存
详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4 原文出处: trigkit4 基本类型值有:undefined,NUll,Boolean,Number和Strin ...
- linux dmesg命令参数及用法详解(linux显示开机信息命令)
linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...
- SQLServer找出执行慢的SQL语句
SELECT (total_elapsed_time / execution_count)/1000 N'平均时间ms' ,total_elapsed_time/1000 N'总花费时间ms' , ...
- Power-BI 关于2016年7月份深圳一手房房价分析报表 腾讯课堂开课啦
上周我们的公开课讲了全国房地产投资开发的情况,通过对时间.区域等多维度的分析,透析了全国房地产开发的投资情况.这周呢,我们就全国一线城市的房价,选取了深圳作为分析对象,对深圳一手房房价进行一 ...