前言

MVP,这里指的并不是篮球比赛中的MVP(最有价值球员),而是一种代码框架和设计思想,它是由MVC演变而来的。

MVP模式(Model-View-Presenter)

是MVC模式的一个衍生。主要目的是为了解耦,使项目易于维护。

Model 是业务逻辑和实体模型

View 是包含Presenter的引用。所要做的就是当有交互时,调用Presenter里的对应方法。通常会通过Activity实现

Presenter 是负责完成View于Model间的交互,从Model里取数据,返回给View处理好的数据。

MVC模式(Model-View-Controller)

主要目的是讲显示逻辑和业务逻辑独立出来

Model 是应用程序中用于处理应用程序数据逻辑的部分。

View 是应用程序中处理数据显示的部分。

Controller 是应用程序中处理用户交互的部分

从构造图上可以看到最主要的差异就是

MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的

MVP使用方法

代码结构

代码内容

LoginActivity.java

public class LoginActivity extends AppCompatActivity implements ILoginView {

    @Bind(R.id.usernameWrapper)
TextInputLayout usernameWrapper;
@Bind(R.id.passwordWrapper)
TextInputLayout passwordWrapper;
@Bind(R.id.bt_clear)
Button btClear;
@Bind(R.id.bt_login)
Button btLogin; private LoginPresenterCompl loginPresenterCompl; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this); loginPresenterCompl = new LoginPresenterCompl(this); } @OnClick({R.id.bt_clear, R.id.bt_login})
public void onClick(View view) {
String username = usernameWrapper.getEditText().getText().toString();
String password = passwordWrapper.getEditText().getText().toString(); switch (view.getId()) {
case R.id.bt_clear:
loginPresenterCompl.clearText();
break;
case R.id.bt_login:
loginPresenterCompl.doLogin(username, password);
break;
}
} @Override
public void onLoginResult(boolean isLogged) {
if (isLogged) {
Toast.makeText(this, "Logged in Successfully", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Logged Failed", Toast.LENGTH_SHORT).show();
}
return;
} @Override
public void onClearText() {
usernameWrapper.getEditText().setText("");
passwordWrapper.getEditText().setText("");
usernameWrapper.clearFocus();
passwordWrapper.clearFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(),
0);
}
}
}

LoginActivity实现ILoginView接口

public interface ILoginView {
void onLoginResult(boolean isLogged);
void onClearText();
}

LoginPresenterCompl.java实现ILoginPresenter接口

public class LoginPresenterCompl implements ILoginPresenter{

    private ILoginView iLoginView;
Handler handler; public LoginPresenterCompl(ILoginView loginView) {
iLoginView = loginView;
handler = new Handler(Looper.getMainLooper());
} @Override
public void doLogin(String username, String password) {
final String tp_username = username;
final String tp_password = password;
new Thread(new Runnable() {
@Override
public void run() {
boolean isLogged = false ;
if(UserModel.isValidUser(tp_username , tp_password)) {
isLogged = true;
}
final boolean tp_isLogged = isLogged;
handler.post(new Runnable() {
@Override
public void run() {
iLoginView.onLoginResult(tp_isLogged);
}
}); }
}).start(); } @Override
public void clearText() {
new Thread(new Runnable() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
iLoginView.onClearText();
}
}); }
}).start(); }
}
public interface ILoginPresenter {
void doLogin(String username, String password);
void clearText();
}

UserModel.java这个没有怎么使用,但是实际使用过程中不同的Model会有不同的处理方式

public class UserModel {
public String username;
public String password; public UserModel(String username, String password) {
this.username = username;
this.password = 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;
} public static boolean isValidUser(String username, String password){
return (username.equals("guagua") && password.equals("guagua"));
}
}

简约类图:

效果图

<Android 基础(三)> MVP模式的更多相关文章

  1. [译]Google官方关于Android架构中MVP模式的示例

    概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...

  2. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  3. 在Andoid开发中使用MVP模式来解耦,增加可测试性

    by Jeff Angelini posted on 7/20/2011 2:35:00 PM 将应用程序UI的表现从Ui的逻辑中分离是一个好的想法.这种分离减少了代码耦合,代码更加干净, 甚至可以有 ...

  4. MVP模式(Android)

    以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MV ...

  5. Android -- 思考 -- 为什么要在项目中使用MVP模式

    1,其实有时候一直在找借口不去思考这个问题,总是以赶项目为由,没有很认真的思考这个问题,为什么我们要在项目中使用MVP模式,自己也用MVP也已经做了两个项目,而且在网上也看了不少的文章,但是感觉在高层 ...

  6. iOS学习之MVC,MVVM,MVP模式优缺点

    为什么要关注架构设计? 因为假如你不关心架构,那么总有一天,需要在同一个庞大的类中调试若干复杂的事情,你会发现在这样的条件下,根本不可能在这个类中快速的找到以及有效的修改任何bug.当然,把这样的一个 ...

  7. MVP模式和MVVM模式

    MVP模式 模型-视图-表示器,也就是MVP模式.是mvc模式的一种衍生模式,专注于改进表示逻辑. 与MVC不同,来自view的调用将委托给presenter(表示器),表示器通过接口与view对话. ...

  8. 控件使用经验-MVP模式+控件封装

    项目背景 几年前参与了一个面向学校的人事管理软件的开发,基于WinForm平台.今天主要想谈一谈其中关于控件的使用经验.这个项目我们大量使用了第三方控件.由于这个产品的生命周期很长,我们在设计时要考虑 ...

  9. MVP模式在Android项目中的使用

    以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MV ...

  10. MVP模式

    一.软件设计鼻祖MVC 1.1.MVC 第一次听到MVC这个名词是在C#中,相信对于MVC大家都已经很熟悉了,作为一种软件设计模式,MVC这个概念已经诞生好多年了. 如果你已经开发一段时间的iOS应用 ...

随机推荐

  1. 在Visual Studio开发的项目中引用GAC中的dll

    Open the windows Run dialog (Windows Key + r) Type C:\Windows\assembly\gac_msil. This is some sort o ...

  2. 【转】eclipse中window->preference选项中没有tomcat的解决方法

    eclipse中window->preference选项中没有tomcat的解决方法 2011-09-09 13:46:35|  分类: eclipse|字号 订阅 其实一共有好几种方法,这只是 ...

  3. 如何保持blog的高质量(相对于自己的进步而言的)

    多写! 多改!! 多删!!!

  4. DMA缓冲区乒乓操作的处理

    http://www.51hei.com/bbs/dpj-141761-1.html https://blog.csdn.net/sunnydreamrain/article/details/8288 ...

  5. webpack4下import()模块按需加载,打包按需切割模块,减少包体积,加快首页请求速度

    一:背景 因为项目功能越加越多,打包后的体积越来越大,导致首页展示的时候速度比较慢,因为要等压缩的js的包加载完毕. 首页展示的时候只需要对应的js,并不需要全部的js模块,所以这里就可以用按需加载, ...

  6. linux网络基础-网卡bonding技术

    1.bondingbonding(绑定)是一种linux系统下的网卡绑定技术,可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是 ...

  7. [Xcode 实际操作]四、常用控件-(16)为MKMapView指定地理坐标

    目录:[Swift]Xcode实际操作 本文将演示如何自定义地图视图的的地理坐标 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先 ...

  8. Java 异常处理基本规则,Java异常处理的基本规范

    看了团队中原来代码中的异常处理,心碎了一地,稍微对照阿里巴巴的异常处理规范整理了一遍,准备分享一下,Java的异常处理规范&约束. 一.运行异常的扑捉 不要捕获 Java 类库中定义的继承自  ...

  9. nodejs + webpack4 + babel6 结合写Chrome浏览器插件记录

    最近任务不忙,有时间了看一下Chrome插件相关的东西,于是想用nodejs + webpack写一个能直出插件的小工具. 1.nodejs + babel6 + webpack4 在写之前,是有把它 ...

  10. 帝都Day5——依旧是数据结构

    /*Day1.Day2我尽量整理吧*/ 树状数组 树状数组滋瓷单点修改和前缀查询 加特技可以使得树状数组支持更多操作. c[2n+1]=a[2n+1](奇数就是它本身) c[2n]≠a[2n](偶数不 ...