### MVP简介

>MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的[地方](https://baike.baidu.com/item/%E5%9C%B0%E6%96%B9/2262175):Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

对于MVC不了解的朋友可以查此文:
[Android进阶之路(1)-详解MVC](https://www.jianshu.com/p/285f6a8d971f)

**Android中的MVP:**
- M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。和MVC类似

- V层:对应的Activity,负责xml绘制与页面交互
- P层:负责View与Model之间的交互

![](https://img2018.cnblogs.com/blog/1312938/201909/1312938-20190901084219353-399431689.png)

### 为什么要用MVP
我们先想想上篇文章,我们讲到为什么要用MVC,当时我们总结了几点:
- 代码复用
- 耦合性低
- 方便维护的高等

然而我们在写MVC项目时候,也发现了一些问题:
1.对于Android中的Activity或者Fragment ,我们不能很清晰的区分它是View还是Controller,既有交互又有页面绘制,这就导致了activity和fragment很“庞大”

2.View与Model确实是分离的,但是关联性太强,这就导致activity与model的联系强,这样我们只要改一点点代码, model 、view、activity 都会变,维护成本太高,View与Model之前的耦合性太高。

而MVP最大的改变就是View与Model实现完全隔离。View把操作意图给P层,P收到后,会调用Model层来实现具体的逻辑, 逻辑实现后会再通知给P, P再通过View的接口回调给View。即便V和M更改了,也不会有影响,耦合性低。

### MVP DEMO
以登录模块为例,来实现MVP

**1.定义View接口- ILoginView**
```
/**
* 获取view层的dialog
*
* @return retuen
*/
Dialog getLoadDialog();

/***
* 关闭view层的dialog
*/
void cancelLoadDialog();

/**
* 获取手机号参数
*
* @return username
*/
String getPhone();

/**
* 获取密码
*
* @return password
*/
String getCode();

/**
* 弹出消息
*
* @param msg msg
*/
void showMsg(String msg);
```
View接口大家都明白吧?就是你要告诉给P的意图。activity实现此接口。并调用P的方法:
```
@Override
public void cancelLoadDialog() {

if (dialog!=null&&dialog.isShowing()){
dialog.dismiss();
}

}

@Override
public String getPhone() {
return edPhone.getText().toString();
}

@Override
public String getCode() {
return edCode.getText().toString();
}

@Override
public void showMsg(String msg) {
Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
}

```

```
mPresenter.login();
```

**2.定义Model与ModelImpl**
Model:
```
public interface ILoginModel {

void login(String phone, String code, OnLoadDatasListener onLoadDatasListener);

}
```
ModelImpl :
```

@Override
public void login(String phone, String code, final OnLoadDatasListener onLoadDatasListener) {
//填写具体的操作逻辑与onLoadDatasListener回调
}
```

model实现类逻辑处理完成之后会通知给P,定义P:
```
/**
* 登陆
*/
public void login() {
if (mView == null) return;
if (TextUtils.isEmpty(mView.getPhone()) || TextUtils.isEmpty(mView.getCode())) {
mView.showMsg("手机号或密码不能为空");
return;
}
mView.getLoadDialog().show();
loginModel.login(mView.getPhone(), mView.getCode(), new OnLoadDatasListener() {
@Override
public void onSuccess(CurrencyBean.DataBean dataBean) {
Gson gson=new Gson();
mView.cancelLoadDialog();
Log.e("qzs---- ",gson.toJson(dataBean)+"");
mView.loginSuccess();
}

@Override
public void onFailure(String error) {
mView.cancelLoadDialog();
mView.loginFail();

}
});

}
```
P通过View接口返回给View

另外MVP也是有缺点的:
- 增加代码的复杂度
- 实现难度增加
- 如果某特定视图的渲染很多(activity),就会造成Presenter与该视图联系过于紧密,一旦该视图需要变更,那么Presenter也需要变更了,不能如预期的那样降低耦合度和增加复用性。

大家可以关注我的微信公众号:「秦子帅」一个有质量、有态度的公众号!

![公众号](https://img2018.cnblogs.com/blog/1312938/201909/1312938-20190901084219519-1281896463.jpg)

Android进阶之路(2)-详解MVP的更多相关文章

  1. Android进阶之路(1)-详解MVC

    最近因为换工作的原因没有写博客,现在慢慢稳定了,我准备写一些关于Android 进阶的文章,也是为了督促自己学习,大家一起进步! 今天详细的分析一下Android APP架构之一:MVC ### MV ...

  2. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  3. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  4. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  5. Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...

  6. Android 之窗口小部件详解--App Widget

    Android 之窗口小部件详解--App Widget  版本号 说明 作者 日期  1.0  添加App Widge介绍和示例  Sky Wang 2013/06/27        1 App ...

  7. Android不规则点击区域详解

    Android不规则点击区域详解 摘要 今天要和大家分享的是Android不规则点击区域,准确说是在视觉上不规则的图像点击响应区域分发. 其实这个问题比较简单,对于很多人来说根本不值得做为一篇博文写出 ...

  8. [Android新手区] SQLite 操作详解--SQL语法

    该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法  :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...

  9. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

随机推荐

  1. Aspnet Mvc 前后端分离项目手记(四)vue项目的搭建(一)(iview)

    一项目创建 1,搭建vue-cli脚手架(依赖npm) 没有安装npm的同学,请先使用npm install -g vue-cli ,然后再进行这一步 安装的过程中有几项 ? Project name ...

  2. jQuery 解析 url 参数

    应用场景: 三毛:我现在拿到一个 url 地址(https://www.google.com/search?dcr=&ei=5C&q=param),我现在要获取 location.se ...

  3. SD卡操作

    读写SD卡 Context类的openFileInput和openFileOutput方法都是针对应用程序的数据文件夹进行的文件操作,由于手机的ROM容量有限,因此这种操作有一定局限性. 手机的SD卡 ...

  4. 从三个语言(C++,Java,.Net)的几个性能测试案例来看性能优化

    随着时间的发展,现在的虚拟机技术越来越成熟了,在有些情况下,Java,.Net等虚拟机密集计算的性能已经和C++相仿,在个别情况下,甚至还要更加优秀.本文详细分析几个性能测试案例,探讨现象背后的原因. ...

  5. 在 Windows 上使用 Python 进行 web 开发

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们介绍了在Windows 10下进行初学者入门开发Python的指 ...

  6. maven项目引用错误 和项目结构问题

    解决办法: 鼠标右键   maven ---->update prroject Configuration 然后 maven clean  maven install

  7. 自定义SWT控件二之自定义多选下拉框

    2.自定义下拉多选框 package com.view.control.select; import java.util.ArrayList; import java.util.HashMap; im ...

  8. Tomcat+MySQL常见调优参数

    一.Tomcat 调优 (一).Tomcat内存优化 参数一: vim /tomcat/bin/catalina.sh CATALINA_OPTS="-server -Xms128m -Xm ...

  9. weblogic 内存溢出解决 java.lang.OutOfMemoryError: PermGen space

    解决办法: 1.在idea中,运行时给weblogic server中 VM options 配置增加内存的参数:-server -XX:PermSize=1024m -XX:MaxPermSize= ...

  10. Spark 系列(四)—— RDD常用算子详解

    一.Transformation spark 常用的 Transformation 算子如下表: Transformation 算子 Meaning(含义) map(func) 对原 RDD 中每个元 ...