MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了,大家也都在讨论关于MVP的理论,只是结构化的资料非常少。这就是我写这篇博客的原因,我想鼓励大家多参与讨论,然后把MVP模式运用在项目开发中。

什么是MVP?

MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面。首先要澄清就是MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自己的项目结构中使用MVP模式。

为什么要使用MVP?

我们知道在Android上逻辑接口和数据存取是紧耦合的,这个问题可以看看CursorAdapter这个例子,它既融合了适配器,同时也有显示的成分,而cursor很大程度上应该是数据数据存取层的。

对于一个可扩展、稳定的应用来说,我们需要定义各个分离层,毕竟,我们不知道以后还要加入什么逻辑,是从本地数据库检索数据?还是从远程的web Service中?

MVP模式可以让显示界面和数据分离,我们开发的应用可以分离至少三层,这样也可以进行独立测试。有了MVP我们就可以从Activity中分离大部分代码,而且不用单元测试可以对每个模块进行单独测试了。

怎么在Android上实现MVP?

说到这里,问题就有点复杂了。实现MVP的方式有很多种,每个人都可以根据自己的需求和自己喜欢的方式去修正MVP的实现方式,它可以随着Presenter的复杂程度变化。

在View中需不需要控制进度条?或者是在Presenter处理?还有,谁来决定Action Bar该显示什么操作?这是一个艰难的决定。这里我会展示我自己的做法,但是我希望本文成为一个讨论如何应用MVP的地方,因为目前为止还没有实现MVP的标准方式。

Presenter

Presenter主要作为沟通View和Model的桥梁,它从Model层检索数据后,返回给View层,但是不想典型的MVC结构,因为它也可以决定与View层的交互操作。

View

View通常来说是由Activity实现的(也许是Fragment,VIew,取决于app的整体结构),它会包含一个Presenter的引用,最理想的是Presenter由一个依赖注入管理器提供,比如Dagger,不过如果不用注入器的话,就需要独立创建Presenter对象了。View要做的就只是在每次有接口调用的时候(比如按钮点击后)调用Presenter的方法。

Model

对于一个结构化的APP来说,Model主要是通向主领域层或者逻辑层的通道,如果使用了Uncle Bob clean architecture的话,Model就可能是一个实现了用例场景的交互工具,这也是我将要在另一篇文章中讨论的一个主题。现在,只要把它看做是给View提供数据的容器就对了。

一个例子

鉴于已经解释的太长了,本人写了一个例子an MVP example on Github,由一个登录界面组成,可以验证数据然后进入一个带有列表的主界面,数据来自Model,因为比较简单,所以本文就不讲代码了,但是如果读者觉得还是很难理解的话,我还可以再写一篇文章详细介绍。

总结

在Android上要分离接口和逻辑不容易实现,但是Model-View-Presenter模式可以更简单的防止在Activity中掺杂太多代码在大的项目中,组织好代码结构是最基本的要求,不然,代码的稳定和扩展就很困难了。

原文链接: antonioleiva   翻译: 伯乐在线 - chris
译文链接: http://blog.jobbole.com/71209/

本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/p/3841527.html,如需转载请自行联系原作者

Android上的MVP:如何组织显示层的内容相关推荐

  1. android mvp模式鸿洋,Android上的MVP模式

    什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不是一个结构化的模式,它 ...

  2. 基于Android小巫新闻客户端开发---显示新闻详细内容UI设计

    基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的内容介 ...

  3. jsf如何通过按钮切换在同一个页面上的非公共部分显示不同的内容

    2019独角兽企业重金招聘Python工程师标准>>> 在jsf中,同一个页面上有公有的内容,也有非公有的内容,通过一个按钮进行切换来显示不同的内容(通过ajax实现):    前台 ...

  4. layui 鼠标移入变为小手_如何在 LayUI 数据表格的列元素上,鼠标悬浮,显示所有文字内容(修改源码)...

    文中使用的LayUI版本:layui-v2.5.5 问题描述: 最近参与开发了 问题分析: 要实现鼠标悬浮显示所有内容,一般采用的都是给对应元素上添加 title 属性,这样当鼠标悬浮在对应列的时候, ...

  5. Android新闻客户端开发3--显示新闻详细内容UI设计

    基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的内容介 ...

  6. 移动端上传大文件到服务器,android上传大文件到服务器地址

    android上传大文件到服务器地址 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...

  7. Android手机teams,在iOS和Android上自定义Microsoft Teams体验的三种最佳方法

    以下是您可以在iOS和Android上自定义Microsoft Teams应用程序以使其成为自己的三种方法 1. 开启黑暗模式,以便iOS和Android上的小组中的消息和其他内容更易于理解和阅读 2 ...

  8. android 适合mvp模式,Android中的MVP:如何使Presenter层系统化?

    MVP(Model View Presenter)模式是著名的 MVC(Model View Controller)的衍生物,并且是 Android 应用程序中管理表示层的***的模式之一. 这篇文章 ...

  9. Android上使用OpenGLES2.0显示YUV数据

    在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源 ...

最新文章

  1. c++如何让字符串重复输出_2020.10.02错题总结之字符串相关函数
  2. Maven详解(转)
  3. JMETER分布式部署注意事项
  4. 修改zepto源代码,使支持wp8的ie10
  5. ISO27001体系的价值(详解)
  6. 智能温控风扇、DS18B20、原理图、PROTEUS仿真图、PCB图
  7. Excel数据分析(八)图表
  8. 思科2960交换机光口激活失败,提示has bad crc,解决方法
  9. O2O模式成功案例分享 汲取精华化为己用
  10. android 日历翻页动画,datetimepicker一个不错的日历android特效
  11. javascript网页设计期末作业 购物网站
  12. c语言 求单元格中间某段字符串,EXCEL怎么取单元格里面的的值的中间某些字符...
  13. java 人脸检测 人脸抓拍
  14. 信息隐藏——第四章 图像信息隐藏数
  15. 《微波原理与技术》学习笔记3传输线理论-史密斯圆图(Smith Chart)
  16. 系统注册表方式修改背景颜色
  17. 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
  18. 桁架工业机器人编程_工业机器人应用与编程
  19. 洛谷4774 BZOJ5418 NOI2018 屠龙勇士 扩展中国剩余定理 multiset
  20. 空间几何-向量在另外一个向量上的投影计算

热门文章

  1. SQL防注入程序 v1.0
  2. UISegmentedControl 分段器加载不同的viewcontroller
  3. 普加甘特图集成到第三方JS框架(MiniUI、jQuery、Ext等)
  4. AgileEAS.NET平台开发实例-药店系统-报表开发(上)
  5. linux 特殊符号(转)
  6. Ms Press China MVP-书评活动-王万利 Microsoft Active Directory Administrator's Pocket Consultant...
  7. 官方文档,才是正途-docker-compose
  8. python 通过paramiko模块批量执行ssh命令
  9. 玩转Android之在线视频播放控件Vitamio的使用
  10. 分享一个 org.w3c.dom XML 封装