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(Model-View-Presenter)模式的方法.如果你对MVP模式还不熟悉,或者不了解为什么要在Android应用中使用MVP模式,推荐你先阅读这篇维 ...
- 适用android的MVP:怎样组织展示层
原文 MVP for Android:How to organize presentation layer http://antonioleiva.com/mvp-android/ 译文 MVP(Mo ...
- Android上使用OpenGLES2.0显示YUV数据
在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源 ...
- 关于Unity程序在IOS和Android上显示内嵌网页的方式
近期因为有须要在Unity程序执行在ios或android手机上显示内嵌网页.所以遍从网上搜集了一下相关的资料.整理例如以下: UnityWebCore 从搜索中先看到了这个.下载下来了以后发现这个的 ...
- 一个Android上的以滑动揭示的方式显示并切换图片的View
SlideView是一个Android上的以滑动揭示的方式显示并切换图片的View,以视觉对比的方式把一套相似的图片展示出来. 示例 翻页图片揭示效果: 特性 设置一组(List<ImageIn ...
- Android实现多条Toast快速显示(强制中止上一条Toast的显示)
Android实现多条Toast快速显示 Toast多用于我们开发人员调试使用,有时候也作为给用户的弱提示使用,我们常用的方法是 Toast.makeText(this, "弹出Toast& ...
- Android上实现各种风格的隐藏菜单,比如左右滑动菜单、上下滑动显示隐藏菜单
Android上的菜单展示风格目前是各式各样的,但用的最多且体验最好的莫过于左右滑动来显示隐藏的菜单本示例实现了各种方式的菜单展示效果,只有你想不到的源码:https://github.com/Sim ...
- unity, RT .DiscardContents ()导致android上RT不显示
RT .DiscardContents ()可以消除pc上的warning,但是会导致android上RT不显示.
- unity, imageEffect在android上不显示的问题
使用imageEffect做了个景深特效,原理很简单,就是一张清晰大图和一张模糊小图根据z值进行混合,z值小的像素清晰大图的比例高一些,z值大的像素模糊小图的比例高一些. 在pc上是ok的,但打出an ...
随机推荐
- 每日学习总结<二> 2015-9-1
Android: 知识点: 子线程中无法更新UI,因为UI是线程不安全的. Android的UI单线程模式: 不能阻塞UI线程: 不能从UI线程的外部访问Android UI toolkit ...
- SQL--联合查询【Union】
集合运算符是针对两个集合操作的,两个集合必须有相同的列数:列具有相同的数据类型(至少能够隐式转换的);最终输出的集合的列名是,由第一个集合的列名来确定的(可以用来连接多个结果). 注意:联合[Unio ...
- C#基础01
ASP.net基础详情 1:Momo就是跨平台的一种.net,借助其Momo可以让其.net网站跑到Lumin和安卓机上面. 2:开发的网站具有安全,速度快,容易配置. 3:互联网开发[网站]和管理系 ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- [小工具]CSS内嵌样式自动提取器
逐行分析,将内联样式提取出来,并自动编号代替的一个小工具软件 注:style=""(此处必须是标准的双引号!) http://files.cnblogs.com/quejuwen/ ...
- SingalR--介绍
什么是SignalR? ASP.NET SignalR是为简化开发开发人员将实时web内容添加到应用程序过程而提供的类库.实时web功能指的是让服务器代码可以随时主动推送内容给客户端,而不是让服务器等 ...
- jquery可见性选择器(匹配所有隐藏的元素)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MySQL的Incorrect string value错误
用以下SQL语句向表2中插入数据: insert into 表2 select * from 表1 结果出现Incorrect string value错误: 打开表2一看,里面全是问号: 后来才发现 ...
- vim退出后终端保留 退出前的内容
export TERM=linux 或者 具体选项 可以看看secrecrt的选项
- mysql学习笔记 第四天
mysql引擎: archive(档案)[数据插入以后不能被修改,只读] blackhole[这种写操作是删除数据,读操作是返回空白记录] CSV[在储存数据时以逗号作为数据项之间的分隔符] exam ...