Mvp模式简介

衍生于MVC 模式,降低了耦合性,避免了View(Activity/Fragment)承担了所有的责任,

分担了UI层的职责。

在MVP模式里通常包含4个要素:

* View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);

* View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;

* Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);

* Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

为什么要使用 MVP模式

在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,

并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的 职责不断增加,

以致变得庞大臃肿。当我们将其中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity其实就是MVP模式中 View,

它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类),同时自己也会处理一些简单的逻辑(复杂的逻辑交由

Presenter处理).

在实际的开发过程中,往往需求和界面是不确定的,随着开发的不断推进,原来的很多界面基本修改得面目全非,这是许多开发者面临

的一个非常头疼的问题,MVP在一定程度上了解决了这个问题。

##MVP 实战

(0)UserBean


public class User { private int id;
private String name ;
private String mobile ;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", mobile=" + mobile + ", password=" + password + "]";
}
}

(1)IUserModel 用户登录model接口

需要实现其接口,一般是读取网络数据,并存在JavaBean 中,并对javabean 有set和get的读写权限。



一般为了需要一个Listerner 来监听网络请求读写数据的情况。

 public interface IUserModel {

    // 用户登录接口
public void login(String phone, String passwdMd5, final LoginHandler handler); }

(2)IUserLoginView 用户登录view 接口

根据需求,VIEw 需要对Model的bean数据进行操作,当登录成功,返回登录人信息情况。

 public interface IUserLoginView extends IUserView {
public void onUserLoginSuccess(User user); public void onUserLoginError(String msg);
}

(3)IUserModel监听类

Model联网成功后,根据返回情况进行监听,它也起到了传递数据的作用,它将Model的数据传递给

Presenter ,从而Presenter 来讲数据传递给view


public interface LoginHandler extends NetworkHandler {
public void onLoginSuccess(User user); // 登录成功 public void onLoginError(String msg); // 登录失败
}

(4)UserPresenter

连接model 层和 view层,处理model和view进行交互。

 public class UserPresenter {
private static final String TAG="UserPresenter"; private IUserModel mUser;
private IUserView mView; /**
* 创建用户模型的主导器
*
* @param view 如果不需要进行界面展示则View传入null
*/
public UserPresenter(@Nullable IUserView view) {
mUser = UserModel.getInstance();
mView = view;
} public void login(String mobile,String password){
mUser.login(mobile, password, new LoginHandler() { @Override
public void onlinkError(String msg) {
if(mView!=null&&mView instanceof IUserLoginView)
( (IUserLoginView) mView).onUserLoginError(msg); } @Override
public void onLoginSuccess(User u) {
if (mView != null && mView instanceof IUserLoginView)
((IUserLoginView) mView).onUserLoginSuccess(u); } @Override
public void onLoginError(String msg) {
if(mView!=null&&mView instanceof IUserLoginView)
((IUserLoginView)mView).onUserLoginError(msg); }
});
} }

(5)View 实现层

public class MainActivity extends Activity implements IUserLoginView{

    @ViewInject(id=R.id.btn_login,click="login") Button btn_login;
@ViewInject(id=R.id.et_login_name)EditText et_login_name;
@ViewInject(id=R.id.et_login_password) EditText et_login_password;
private Context mContext;
private UserPresenter userPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FinalActivity.initInjectedView(this);
mContext=this;
userPresenter=new UserPresenter(this);
} public void login(View v){
String mobile=et_login_name.getText().toString();
String password=et_login_password.getText().toString();
String md5Pwd=MD5(password);
userPresenter.login(mobile, md5Pwd); } @Override
public void onUserLoginSuccess(User user) { Toast.makeText(mContext, ""+user.toString(), Toast.LENGTH_SHORT).show(); }
@Override
public void onUserLoginError(String msg) {
Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); } public final static String MD5(String plain) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(plain.getBytes("UTF-8"));
byte[] m = md5.digest();
StringBuilder hex = new StringBuilder(m.length * 2);
for (byte b : m) {
if ((b & 0xFF) < 0x10) hex.append("0");
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

代码并不难,希望通过我这个例子,一是巩固自己的学习和理解,二是希望更多的人更好的学习,我会再接再厉,写

更多的博文。

源码下载

AndroidMVP的更多相关文章

  1. Android Studio开发快速创建MVP框架插件AndroidMVP

    转载:https://www.jianshu.com/p/60cd98bbc358 Android开发中,我们为了代码的解耦以及后期的维护方便,都会采用一些开发框架,常用的有MVC.MVP.MVVM. ...

  2. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式

    今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小案例,希望对大家有所帮助,效果图: Retrofit是Square公司开发 ...

  3. kotlin for android----------MVP模式实现登录

    学习了Kotlin,随便来个小案例,以MVP+Kotlin 来实现登录的一个小案例,希望对大家有所帮助,效果图: MVP: Model Model 是用户界面需要显示数据的抽象,也可以理解为从业务数据 ...

  4. Android--MVP设计模式实践

    MVP设计模式是android开发讨论的很火的一个话题,我对设计模式也有一些拙见,为了实践我的一些想法,我在我最新开发的产品中将我心目中的MVP设计模式进行了实践,最后得到了这样的架构. 特点:简单, ...

  5. Android Weekly Notes Issue #222

    Android Weekly Issue #222 September 11th, 2016 Android Weekly Issue #222 ARTICLES & TUTORIALS Fo ...

  6. android MVC && MVP && MVVM分析和对比

    相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...

  7. 浅谈 MVP in Android

    一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等.本篇博文仅是为了做下记录,提出一些自己的看法,和帮 ...

  8. Android 项目中用得最多最火的第三方框架可能都在这里了

    分类 二级分类 框架名称 简介 Star 数 最近更新 UI 刷新 SmartRefreshLayout 智能下拉刷新框架 14k 18天 UI 刷新 Android-PullToRefresh 比较 ...

  9. Android百大框架排行榜

    Android百大框架排行榜 15类Android通用流行框架 - 流风,飘然的风 - 博客园https://www.cnblogs.com/zdz8207/p/android-opensource- ...

随机推荐

  1. SpringBoot | 第三十三章:Spring web Servcies集成和使用

    前言 最近有个单位内网系统需要对接统一门户,进行单点登录和待办事项对接功能.一般上政府系统都会要求做统一登录功能,这个没啥问题,反正业务系统都是做单点登录的,改下shiro相关类就好了.看了接入方案, ...

  2. 白话SpringCloud | 第十一章:路由网关(Zuul):利用swagger2聚合API文档

    前言 通过之前的两篇文章,可以简单的搭建一个路由网关了.而我们知道,现在都奉行前后端分离开发,前后端开发的沟通成本就增加了,所以一般上我们都是通过swagger进行api文档生成的.现在由于使用了统一 ...

  3. 在nginx上部署django项目--------Gunicorn+Django+nginx+mysql

    一.安装nginx 以前的博客我有写,这里就不写了 http://www.cnblogs.com/wt11/p/6420442.html 二.安装mysql 我用的mysql5.7  64位的二进制包 ...

  4. bzoj 3576: [Hnoi2014]江南乐

    Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F ...

  5. css三角块

    html: <div class="angle"></div> css: .angle{ width: 0px; height: 0px; border-b ...

  6. 很有用的PHP笔试题系列三

    1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION 与 COOKIE的区别是什么,请从 ...

  7. 文件读取工具类读取properties文件

    1.创建工具类 import java.io.IOException; import java.util.Properties; /** * * 类名称:PropertiesUtil * 类描述: 文 ...

  8. IOS微信浏览器点击事件不起作用问题

    问题: $(document).on("click",".btn",function(){alert("1")}); 在微信浏览器上点击不起 ...

  9. props的异步加载问题

    在写vue项目的时候,父组件调用ajax的接口获得数据,然后赋值给data中的初始值,然后通过props传给子组件,子组件在created的时候,获得的props的值有的时候是undefined,因为 ...

  10. MCU & 51单片机