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模式的更多相关文章

  1. Android开发MVP模式解析

    http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...

  2. android的MVP模式

    MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...

  3. 说说Android的MVP模式

    http://toughcoder.NET/blog/2015/11/29/understanding-Android-mvp-pattern/ 安卓应用开发是一个看似容易,实则很难的一门苦活儿.上手 ...

  4. Android开发 MVP模式的规范记录(个人总结)

    前言 首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不 ...

  5. android中MVP模式(一) - 清风明月的专栏 - CSDN博客

    presenter 主持人.主导器 ====== 1. 明确需求,界面如下:可存,可根据id读取数据. 包结构图 2. 建立bean public class UserBean { private S ...

  6. Android中MVP模式与MVC模式比較(含演示样例)

    原文链接 http://sparkyuan.me/ 转载请注明出处 MVP 介绍 MVP模式(Model-View-Presenter)是MVC模式的一个衍生. 主要目的是为了解耦,使项目易于维护. ...

  7. ym——Android开发MVP模式(攻克了View和Model的耦合)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 什么是MVP呢?它又和我们经常听到的MVC有什么关系了以及差别呢? MVP 是从经典的 ...

  8. Android之MVP模式实现登录和网络数据加载

    MVP简介 相信大家对 MVC 都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,也是作为用户界面(用户层)的实现模式,那么类似的 ...

  9. (未完成)【Android】MVP模式初见(一)

    最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意. 虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近.因此接下来一段时间,主要学习一下MVP架构.Retrofit以及RxJav ...

随机推荐

  1. FTS抓包看L2CAP Connection的建立(二)

    1.概述     前面一篇博文已经介绍到远端设备对本地的Connection request进行了response,目前L2CAP的连接处于pending状态.这篇将继续抓取下面的一些packets, ...

  2. ios 消息传递机制

    引用文章 一.KVO 1.当对象中的某个属性值发生了改变,可以对这些值的观察者做出通知. 2.接受者(会接收到值发生改变的消息) 必须知道发送者(值将发生改变的那个对象). 3.接收者同样还需要知道发 ...

  3. Mschat控件示例升级错误处理方法

    将具有 3.5 版图表控件的 ASP.NET 3.5 网站升级到 ASP.NET 4 需要更改 web.config 和注册指令 将具有 3.5 版图表控件的 ASP.NET 3.5 网站升级到 AS ...

  4. mysql源码重启

    1.通过rpm包安装的MySQL service mysqld restart /etc/inint.d/mysqld start 2.从源码包安装的MySQL // linux关闭MySQL的命令 ...

  5. 【Android测试】【随笔】Bugtags初体验

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5410003.html 前言 早晨接到一个临时任务,就是尝试 ...

  6. C# 字符串的截取和替换

    1.取字符串的前n个字符 (1)string str1=str.Substring(0,n); (2)string str1=str.Remove(i,str.Length-n); 2.去掉字符串的前 ...

  7. 使用ASP.NET web API创建REST服务(二)

    Creating a REST service using ASP.NET Web API A service that is created based upon the architecture ...

  8. eclipse如何修改dynamic web module version

    eclipse如何修改dynamic web module version 一.修改工程属性: 右键eclipse的工程,选择属性,再选择Project Facets里面中选择Dynamic Web ...

  9. 创建podSpec,使用pod管理第三方库

    提要: podfile文件会先读取.podspec文件,根据.podspec文件的指向来下载第三方库到项目中. 本文先通过一.二.三项,这三个步骤讲解了如何建立一个.podspec文件在本地.coco ...

  10. jQuery获取自身HTML

    <html><head> <title>jQuery获取自身HTML</title> <meta http-equiv="Content ...