Android上的MVP:如何组织显示层的内容
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/
Android上的MVP:如何组织显示层的内容相关推荐
- android mvp模式鸿洋,Android上的MVP模式
什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不是一个结构化的模式,它 ...
- 基于Android小巫新闻客户端开发---显示新闻详细内容UI设计
基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的内容介 ...
- jsf如何通过按钮切换在同一个页面上的非公共部分显示不同的内容
2019独角兽企业重金招聘Python工程师标准>>> 在jsf中,同一个页面上有公有的内容,也有非公有的内容,通过一个按钮进行切换来显示不同的内容(通过ajax实现): 前台 ...
- layui 鼠标移入变为小手_如何在 LayUI 数据表格的列元素上,鼠标悬浮,显示所有文字内容(修改源码)...
文中使用的LayUI版本:layui-v2.5.5 问题描述: 最近参与开发了 问题分析: 要实现鼠标悬浮显示所有内容,一般采用的都是给对应元素上添加 title 属性,这样当鼠标悬浮在对应列的时候, ...
- Android新闻客户端开发3--显示新闻详细内容UI设计
基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的内容介 ...
- 移动端上传大文件到服务器,android上传大文件到服务器地址
android上传大文件到服务器地址 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...
- Android手机teams,在iOS和Android上自定义Microsoft Teams体验的三种最佳方法
以下是您可以在iOS和Android上自定义Microsoft Teams应用程序以使其成为自己的三种方法 1. 开启黑暗模式,以便iOS和Android上的小组中的消息和其他内容更易于理解和阅读 2 ...
- android 适合mvp模式,Android中的MVP:如何使Presenter层系统化?
MVP(Model View Presenter)模式是著名的 MVC(Model View Controller)的衍生物,并且是 Android 应用程序中管理表示层的***的模式之一. 这篇文章 ...
- Android上使用OpenGLES2.0显示YUV数据
在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源 ...
最新文章
- c++如何让字符串重复输出_2020.10.02错题总结之字符串相关函数
- Maven详解(转)
- JMETER分布式部署注意事项
- 修改zepto源代码,使支持wp8的ie10
- ISO27001体系的价值(详解)
- 智能温控风扇、DS18B20、原理图、PROTEUS仿真图、PCB图
- Excel数据分析(八)图表
- 思科2960交换机光口激活失败,提示has bad crc,解决方法
- O2O模式成功案例分享 汲取精华化为己用
- android 日历翻页动画,datetimepicker一个不错的日历android特效
- javascript网页设计期末作业 购物网站
- c语言 求单元格中间某段字符串,EXCEL怎么取单元格里面的的值的中间某些字符...
- java 人脸检测 人脸抓拍
- 信息隐藏——第四章 图像信息隐藏数
- 《微波原理与技术》学习笔记3传输线理论-史密斯圆图(Smith Chart)
- 系统注册表方式修改背景颜色
- 手游热更新方案xLua开源:Unity3D下Lua编程解决方案
- 桁架工业机器人编程_工业机器人应用与编程
- 洛谷4774 BZOJ5418 NOI2018 屠龙勇士 扩展中国剩余定理 multiset
- 空间几何-向量在另外一个向量上的投影计算
热门文章
- SQL防注入程序 v1.0
- UISegmentedControl 分段器加载不同的viewcontroller
- 普加甘特图集成到第三方JS框架(MiniUI、jQuery、Ext等)
- AgileEAS.NET平台开发实例-药店系统-报表开发(上)
- linux 特殊符号(转)
- Ms Press China MVP-书评活动-王万利 Microsoft Active Directory Administrator's Pocket Consultant...
- 官方文档,才是正途-docker-compose
- python 通过paramiko模块批量执行ssh命令
- 玩转Android之在线视频播放控件Vitamio的使用
- 分享一个 org.w3c.dom XML 封装