Android--MVP设计模式实践
MVP设计模式是android开发讨论的很火的一个话题,我对设计模式也有一些拙见,为了实践我的一些想法,我在我最新开发的产品中将我心目中的MVP设计模式进行了实践,最后得到了这样的架构。
特点:简单,清晰,拓展性好,能够解决目前碰到的业务场景
因为是基于MVP进行的改造,所以同样是有Model,Presenter,View三层,三层的关系如下图:

1. view单向持有presenter,所有同步数据的获取都是通过presenter得到
2. presenter单向持有model,通过model去获取持久化数据
3. presenter单向持有httpCallback,用于发起异步请求
4. httpCallback通过EventBus消息的方式通知到注册了消息的view
5. view自己保存自己的数据,当收到otto消息的时候自行展示
注意只是展示数据而已,不对数据做任何处理,不包含业务
6.单Activity架构,view和view之间的通信通过UiManager来实现,所有Window级别view的创建都在UiManager里面完成
7.UiManager的生命周期同Activity保持一致,view通过event与UiManager进行通信
8.所有对象之间的持有都是通过dagger2框架的依赖注入来实现
这样的设计目的有以下几点:
1. 不设计层和层之间的双向持有,双向持有用来解决的异步更新的问题通过EventBus让view自行实现
1.1. 一是给presenter减负,不需要持有每个view的数据,对view的逻辑控制可以将数据的展现完全交给view来做
1.2. 二是解决了双向持有之间的权利分配问题,减少接口定义的工作,让分层更加清晰,代码更简单
2. 同MVP一样,view负责向presenter索取数据和展示数据,是绝大部分用户交互流程的起点和终点(自发业务除外,比如定时更新等),让view层有更好的拓展性
为了实现以上架构,用了以下几个开源框架,让代码更加简洁:
Dagger2,依赖注入框架,让创建类变成一件很简单的事情
Otto,RxAndroid的前身,一款EventBus框架,解决异步通知的问题
ButterKnife,针对android的代码自动生成框架,不需要再写findViewById和setOnClickListener这样的方法
okhttp+retrofit,网络通信框架,串联式的异步通信开发,保证功能和效率的同时降低开发成本
Android--MVP设计模式实践的更多相关文章
- Android MVP 设计模式
1.基本概念 Model : 模型 负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等: View : 视图 负责界面数据的展示,与用户进行交互: Presenter ...
- android mvp设计模式
什么是MVP MVP,全称 Model-View-Presenter.要说MVP那就不得不说一说它的前辈——MVC(Model-View-Controller,模型-视图-控制器). View:对应于 ...
- android MVP设计模式!
实现原理: MainActivity 用来更新UI,和显示业务逻辑的结果! LoginPresenterCompl 用来处理 业务逻辑 ILoginPresenter 业务处理类抽象出来的接口 ILo ...
- Android架构(一)MVP架构在Android中的实践
Android架构(一)MVP架构在Android中的实践 https://www.300168.com/yidong/show-2790.html 核心提示:为什么要重视程序的架构设计 对程序进 ...
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- Android之MVP设计模式
一.概述 MVP设计模式的前身是MVC,这个无需再议 在安卓工程中MVC对应关系如下: Layout->View : 对应布局文件Activity->Controller,View (其中 ...
- Android MVP模式的初识
MVP是什么?或许在之前更多的人知道的是MVC这个模式(Model View Controller),然而MVP与MVC最不同的一点是M与V是不直接 关联的也是就Model与View不存在直接关系 ...
- Android MVP Presenter 中引发的空指针异常
一.概述 最近对 googlesamples/android-architecture 中的 MVP-dagger 进行了学习.对照项目的 MVP-dagger 分支,对 MVP-dagger 进行了 ...
- Android MVP模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
随机推荐
- Unity3d 布娃娃系统
选中带骨骼的3d模型 GameObject->Create Other->Ragdoll... 点开发现弹出了一个Create Ragdoll的窗体 前面的基础transform把骨骼拖进 ...
- swiper如何实现轮播嵌套轮播
之所以要写这篇文章是因为插件有个bug,要改掉这个bug比较麻烦,所以就想了个折中的办法,绕过这个限制,方法千万条,功能干出来第一条,哈哈 最近做了个需求,效果图是这样的 第一个框是大轮播,第二个框是 ...
- [Nuxt] Navigate with nuxt-link and Customize isClient Behavior in Nuxt and Vue.js
Because Nuxt renders pages on the server, you should use the nuxt-link components to navigate betwee ...
- C API函数描写叙述(S-W)
25.2.3.59. mysql_select_db() int mysql_select_db(MYSQL *mysql, const char *db) 描写叙述 使由db指定的数据库成为由mys ...
- 谈谈我对P2P网络借贷的一些看法
北漂期间,只知道互联网金融非常火,相关创业公司和项目也非常多.2013年,最火的是余额宝等宝宝类产品.当时的收益率达到了7%,流动性如此高的情况下,竟达到这么高的收益率,我简直不敢相信.另外,当时考虑 ...
- ArcGIS IQueryFilter接口
樱木 原文IQueryFilter 1.IQueryFilter::SubFields (1)默认值为“*”,即查询时返回整行数据,如果只需要某一个字段数据(比如“Country”字段),则可以指定 ...
- Eclipse RCP 中创建自己定义首选项,并能读取首选项中的值
Eclipse RCP的插件中若想自定义首选项须要扩展扩展点: org.eclipse.core.runtime.preferences //该扩展点用于初始化首选项中的值 org.eclipse.u ...
- 关于spyder的一些用法
目前还不会用spyder,感觉不习惯,也没怎么用MATLAB 能记住几点算几点吧 1,双击程序左侧栏,加断点 1,按住Ctrl,点击函数,进入函数
- UVALive - 3977 Summits (BFS染色)
题目大意:坑爹的题目.题意那么难理解. 讲的就是,假设该点是山顶的话(高度为h).那么以该点为中心,往外辐射.走高度大于h-d的点,到达不了还有一个比它高的点 这就提示了,高度要从大到小排序,依次以高 ...
- Java算法--串的简单处理
题目例如以下: 串的处理 在实际的开发工作中.对字符串的处理是最常见的编程任务. 本题目即是要求程序对用户输入的串进行处理.详细规则例如以下: 1. 把每个单词的首字母变为大写. 2. 把数字与字母之 ...