前言
MVP作为一种MVC的演化版本在Android开发中受到了越来越多的关注,但在项目开发中选择一种这样的软件设计模式需保持慎重心态,一旦确定 使用MVP作为你App的开发模式那么你就最好坚持做下去,如果在使用MVP模式开发过程中发现问题而且坑越来越大,这时你想用MVC等来重新设计的话基 本上就等于推倒重来了。要知道在Android上MVP在现在为止并没有统一的标准或者框架,不像SSH这三个成熟稳重强而有力的三剑客支持推动着 Java EE的开发,所以在运用MVP时一定要做好自己的理解,并且尽量预知自己App各模块的需求(客户说改改改,我们就改改改 )以便提前做好充分的设计工作。当然MVP既然能出现那么必然有它的优点的,不然谁会理会这个冒出来的东西,下面就对Android中MVP做一些阐述。
MVP简介
相信大家对MVC都是比较熟悉了:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用。而 MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互,MVP的结构图如下所示,对于这个图理解即可而不必限于其中的条条框框,毕竟在不同的场景下多少会有些出入的。在 Android中很重要的一点就是对UI的操作基本上需要异步进行也就是在MainThread中才能操作UI,所以对View与Model的切断分离是 合理的。此外Presenter与View、Model的交互使用接口定义交互操作可以进一步达到松耦合也可以通过接口更加方便地进行单元测试。
MVP结构图
MVP之Model
模型这一层之中做的工作是具体业务逻辑处理的实现,都伴随着程序中各种数据的处理,复杂一些的就明显需要实现一个Interface来松耦合了。
MVP之View
视图这一层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。MVP下Activity和Fragment体现在了这一 层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。例 如,Activity上滚动列表时隐藏或者显示Acionbar(Toolbar),这样的UI逻辑时也应该在这一层。另外在View上输入的数据做一些 判断时,例如,EditText的输入数据,假如是简单的非空判断则可以作为View层的逻辑,而当需要对EditText的数据进行更复杂的比较时,如 从数据库获取本地数据进行判断时明显需要经过Model层才能返回了,所以这些细节需要自己掂量。
MVP之Presenter
Presenter这一层处理着程序各种逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由Model层做具体的业务操作。
演示demo
动手写起代码来才有更好的感觉。demo很简单,还是上个图更直观,输入城市的代号,点击按钮获取城市的天气信息然后显示出来,网络操作使用Volley框架,解析用Gson,其它的就手写了。整个项目的包设计如下:
包结构
项目效果预览
包 图中明显的三层:Model包、Presenter包、UI包,其中,三者都实现各自的结构,Model为WeatherModel、Presenter 为WeatherPresenter、View为Weather,那么具体实现类就是impl包里的了,View层的即为Activity。此外的app 和util包无关紧要可以不看。可以看到采用MVP设计后项目明显多了很多东西,这也是不可避免的,使用原始方法可以使项目开起来简单些但是以后还有维护 呢、测试呢、加功能呢、。。。
entity里的实体属性基本上对应json里的这些属性了,代码不贴了,View里面的接口:
01 |
public interface WeatherView {
|
05 |
void setWeatherInfo(Weather weather);
|
09 |
public interface WeatherPresenter {
|
13 |
void getWeather(String cityNO);
|
17 |
public interface WeatherModel {
|
18 |
void loadWeather(String cityNO, OnWeatherListener listener);
|
prestener里面还有个OnWeatherListener,其在Presenter层实现,给Model层回调,更改View层的状态,确保 Model层不直接操作View层。如果没有这一接口在WeatherPresenterImpl实现的话,WeatherPresenterImpl只 有View和Model的引用那么Model怎么把结果告诉View呢?当然这只是一种解决方案,在实际项目中可以使用Dagger、EventBus、 Otto等第三方框架结合进来达到更加松耦合的设计。
01 |
public interface OnWeatherListener {
|
07 |
void onSuccess(Weather weather);
|
所以demo的代码流程:Activity做了一些UI初始化的东西并需要实例化对应WeatherPresenter的引用和实现 WeatherView的接口,监听界面动作,Go按钮按下后即接收到查询天气的事件,在onClick里接收到即通过WeatherPresenter 的引用把它交给WeatherPresenter处理。WeatherPresenter接收到了查询天气的逻辑就知道要查询天气了,然后把查询天气的具 体业务实现交给WeatherModel去实现同时把WeatherListener即WeatherPresenter自己传给 WeatherModel。WeatherModel进行查询天气业务后即把结果通过WeatherListener回调通知 WeatherPresenter,WeatherPresenter再把结果返回给View层的Activity,最后Activity显示结果。就这 样,拍砖之处请拍。
End
采用哪种软件设计模式都是为了达到如下目的,找到合适的加以运用就是最好的:
本文demo
Rocko’s MVP demo
MVP相关demo
androidmvp
ActivityFragmentMVP
EffectiveAndroidUI
MvpCleanArchitecture
Material-Movies
分享到:
相关推荐
MVP 模式(Model-View-Presenter)可以说是 MVC 模式(Model-View-Controller)在 Android 开发上的一种变种、进化模式。 在 MVC 模式中,Activity 应该是属于 View 这一层。而实质上,它既承担了 View,同时也包含...
在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效...
在main目录创建你的专属目录,以java_开头,如java_snowy,表示这是snowy的个人目录 在模块的build.gradle下注册你的目录,方法在下面 配置你的笔记入口:在Config类中搜菜单1:笔记,配置你自己的page和菜单列表 ...
Android插件化,Android MVP架构,Android MVVM架构的集大成者,帮助您快速构建自己的App项目开发框架,,把自己主要的能量放在自己的项目的业务功能上实现,另外在长期的工作实践中总结整理大量的实用工具类在项目...
在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效...
在Android开发过程中,选择合适的工具能够大大提高开发效率。因此,我们整理了常用的Android开发工具集,包括开发工具、测试工具、性能优化工具等。这些工具都是经过我们精心筛选和测试的,能够帮助开发者们更加高效...
在对应期数文件夹里(例如 issue-2,代表第二期 )创建一个markdown文件,文件命名格式为: 中文标题名 ( 不要有空格,有空格的地方用"-"连接 ) ,比如 Android-MVP模式与实践.md; 将模板template.md中的内容拷贝到你...
在网上找了些资料,整理如下: MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。 模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等; ...
Android 组件化、Android MVP 架构、Android MVVM 架构的集大成者,帮助你快速的搭建自己的 App 项目开发框架,以便把主要的精力放在自己的项目的业务功能实现上,另外在长期的工作实践中总结整理大量的实用工具类在...
Awesome Android > 该项主要用来收集和整理开发过程中经常用到的三方库和控件,并包含一些演示代码。[可以参考下文来了解更多的内容] 代码清单 1、整体结构 /----- /----- advanced IPC, AIDL /----- animations ...
采用谷歌官方MVP架构以及RxJava对项目进行封装重构,持续更新中... 1.网络请求框架:Retrofit 2.View依赖注入框架:ButterKnife 3.数据库框架:Ormlite 4.图片异步加载类库:Glide 5.事件总线:RxEventbus 6.Json...
仿开眼视频Android客户端,本项目主要用来练手Google-MVP已及kotlin,对于急切想熟悉kotlin的童鞋来说是一个不错的练手项目,由于公司任务比较紧急所以本项目目前处于功能完善中,相关技术文章还未整理发布,想参与本...
现在刚到新的环境,可以趁这段时间,整理下在达达时期踩过的坑,学习新的技术。重新调整项目结构,集成当前流行的retrofit okhttp dagger2 mvp rxjava [基础框架参考]:https://github.com/JessYanCoding/MVPArms ...
此项目的架构采用MVP模式,但不是传统的MVP模式,是从Google大神 Chirs Banes 做的 项目中提取出来的。功能、界面是对照着市场上的外卖APP(饿了么、美团外卖、百度外卖)模仿着实现的,图片资源来源于网络,若有...
做了一段时间的外包项目,碍于难以保证历史遗留代码的正确性及技术栈更新问题,在保证各项目正常开发的同时,进行了基础功能的抽离和系统架构的重构,整理出一般项目MVP基本模板,文档旨在描述模板项目各类作用,...
java礼品定制源码 ##在使用Android Studio的时候,在写Dependency依赖...整理的Android学习资源,不定期的更新 ##Merarial Design设计 1. 2. 给力的UI库 3. 一个包装ripple效果的views库 4. 具有ripple效果的background
对自己在github上starred的项目进行一下归类整理,并且会在以后的使用中持续更新。 目录 开源类 开源APP - 开源的 Material Design 风格的豆瓣客户端。 - 简单的Android MD风格的“豆瓣美女”客户端。 - Android版本...
Android知识点整理 Android系统原始码(基于Android 8.0) 四大组件工作过程 WindowManager和WMS 处理程序 看法 活页夹,AIDL Android相关 稀疏数组 回收站视图 性能优化,UI优化 MVVM,MVP,MVC 组件化 热修复 ...
“任务圈”APP,它提供任务信息整理、分类、规范、监控执行、消息推送、及时聊天等功能。满足用户查看、发布、接取、监控等需求,对于任务执行者提供身份审核认证,保障用户权益。本文详细叙述了可行性分析、需求...
整理在github上或者其他地方收集的一些自己觉得有用的链接 Organize some of the links you find useful on github or elsewhere 整理内容比较多,不定时更新,包括 android、react-native、前端、php、python、java...