Android进阶之路(2)-详解MVP
### 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的更多相关文章
- Android进阶之路(1)-详解MVC
最近因为换工作的原因没有写博客,现在慢慢稳定了,我准备写一些关于Android 进阶的文章,也是为了督促自己学习,大家一起进步! 今天详细的分析一下Android APP架构之一:MVC ### MV ...
- Android图片缓存之Bitmap详解
前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android Design Support Library使用详解
Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...
- Android 之窗口小部件详解--App Widget
Android 之窗口小部件详解--App Widget 版本号 说明 作者 日期 1.0 添加App Widge介绍和示例 Sky Wang 2013/06/27 1 App ...
- Android不规则点击区域详解
Android不规则点击区域详解 摘要 今天要和大家分享的是Android不规则点击区域,准确说是在视觉上不规则的图像点击响应区域分发. 其实这个问题比较简单,对于很多人来说根本不值得做为一篇博文写出 ...
- [Android新手区] SQLite 操作详解--SQL语法
该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法 :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...
- Android中Service的使用详解和注意点(LocalService)
Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...
随机推荐
- [ PyQt入门教程 ] Qt Designer工具的布局管理
这节课很重要..界面整洁美观与否就看布局了..这里讲布局方法,至于设计的天赋与最终界面的美感那就看造化了.. 本文主要讲述Qt Designer工具实现界面控件布局管理,就是排列组合控件.包括水平布局 ...
- Golang高效实践之泛谈篇
前言 我博客之前的Golang高效实践系列博客中已经系统的介绍了Golang的一些高效实践建议,例如: <Golang高效实践之interface.reflection.json实践>&l ...
- django中通过文件和Ajax来上传文件
一.通过form表单来上传文件 1.在html模板中 <form action="/index/" method="post" enctype=" ...
- 角度转弧度&根据弧度计算圆周上点的坐标的方法
角度转弧度: #define AngleToRadian(angle) (M_PI/180.0f)*angle 以正东面为0度起点计算指定角度所对应的圆周上的点的坐标: float radian = ...
- Python—推导式
推导式 推导式:comprehensions(又称解析式),是Python的一种独有特性,相当于语法糖的存在,推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2 ...
- Intent 常用方法总结
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本文主要是总结Intent 常用的方法,并封装成Utils类中 主要涉及以下内容 ...
- JSON合并,并按时间排序
mergeJson: function (json1, json2) { var json = Object.assign([], json1, json2); return json.sort(fu ...
- 图像反转(一些基本的灰度变换函数)基本原理及Python实现
1. 基本原理 获取像素值在[0, L]范围内的图像的反转图像,即为负片.适用于增强图像中白色或者灰色的区域,尤其当黑色在图片中占主地位时候 $$T(r) = L-r$$ 2. 运行结果 图源自ski ...
- k8s学习02-----kubeadm部署k8s
机器规划 系统配置 三台机器都执行 1.关闭selinux及firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux ...
- 用CSS来定义<p>标签,要求实现以下效果:字体颜色再IE6下为黑色,IE7下为红色,IE8下为绿色,其他浏览器下为黄色。
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...