我们都知道Android中基本组件是Activity,每一个界面都是一个Activity,自从2.3版本号開始。又添加了Fragment组件,提供了适应于各种屏幕方法。可是因为Android系统仅仅是提供了各种可用的编程技术,并没有相应用架构进规定。实践中,非常多项目将全部功能都加入到了Activity中,使Activity变得十分臃肿。不便于进行后期改动和维护。假设我们要一个人来开发一个系统。那么必须採用高效的应用架构,方便调试及维护。

在开发应用中,採用MVC架构无疑是一种最安全的选择。将应用依照控制器、视图、模型来组织,使系统的耦合降低。灵活性添加,更方便于调试和维护。

可是问题就来了,通常程序猿们会说:Android平台全部组件都是基于MVC的,我的应用自然就是基于MVC架构的呀!事实上这是一种典型的错解。Android组件是基于MVC的不假,可是你的程序在Activity中既保存着从网络获取到的数据,又负责页面更新和显示。同一时候还有业务逻辑。这时这个Activity就差点儿同一时候拥有了模型、视图、控制器功能了,实际上是不符合MVC精神的。

那么在Android平台中,如何体现MVC架构呢?关于这一点,非常多不同的看法。在这里仅仅向大家介绍当中的一种。之所以选择这样的,是由于他与IOS平台上的理念一致,我们要同一时候开发Android和IOS系统,那么相同理念的东西,自然是我们最佳选择了。

对于一个Android中最主要的组件Activity来说。我们能够将布局文件视为视图(View)。而Activity能够视为控制器(Controller),控制器须要与视图进行交互,这时就须要在Activity中获取页面中的各个控件,在Android中通过findViewById方法来实现,而在IOS平台中,採用IOutlet形式实现。当视图中产生一个事件,如用户点击某button。这时须要触发一个事件。这时Android有两种处理方式。一种是直接在布局文件里写click=""。还有一种是通过在Activity中通过调用setOnclickListener来实现,我推荐採用另外一种方案。由于这样不仅是避免了视图与控制器逻辑搅合在一起。同一时候也为了与IOS中採用IAction方式保存一致。这样当须要改变界面内容时,能够在Activity中通过对界面中的控件进行操作,而界面中产生的事件,通过Activity中定义的事件处理函数来进行处理。

这样就有效的区分了控制器和视图的职能。

对于界面中须要显示的数据,我们须要设计单独的模型类,Activity在须要时,调用模型类的相关方法,获取数据并显示到界面中。可是模型类不直接调用Activity的方法。那么。假设模型中的数据改变了。如何通知界面进行更新呢?这里我们採用事件总线机制。当模型数据发生改变时,会向系统总线发送一个事件。全部Activity会向自己所感兴趣的事件进行注冊,方法就将自己的Handler实例增加到事件总线的列表中。这样当模型数据改后。事件总件收到来自模型类的事件。找出对该事件感兴趣的Hanlder实例列表,依次向每一个Handler实例发送消息,这样每一个相关的Activity就能够对模型类数据变化做出正确的响应了。在IOS中。每一个类的属性会有willSet,
didSet这种观察者方法,能够在这些方法中向事件总线发送事件。

应用程序架构例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

从上图能够看出。模型(Model)和视图(View)不会主动调用Activity,同一时候模型(Model)和视图(View)之不发生直接的关系。二者之间的交互都统一通过Activity来进行。

稍后我们将看到。在IOS平台下。我们也会採用同样的架构。

在下一篇博文中。我们将以这个架构为指导,做程序開始时的Splash页面。然后我们会回过头来,描写叙述在IOS平台下。採用Swift 2.0来实现同样的功能。

大家的支持是我继续前进的动力,请大家多多支持:

银行账号:622202 0200 1078 56128 闫涛

我的支付宝:yt7589@hotmail.com

最新文章

  1. PHP 装饰器模式
  2. python学习:函数的学习
  3. 由登录服务器时ulimit配置报错,也谈下ulimit配置
  4. Android Studio 设置LogCat 颜色
  5. gcc 简单编译流程
  6. inotify+rsync实现实时同步
  7. java数组2
  8. 阿里面试题,深入理解Java类加载机制
  9. C++(实验二)
  10. Unable to execute 'doFinal' with cipher instance
  11. 安卓界面之Viewpager和Tablayout实现滑动界面
  12. 8. 博客系统| 富文本编辑框和基于bs4模块防御xss攻击
  13. win7环境下安装composer
  14. css浮动中避免包含元素高度为0的4种解决方法
  15. AddComponentRecursively
  16. css 计算属性 calc的使用
  17. html5拖拽初窥
  18. System.Net.Http.Formatting的nuget版本冲突问题
  19. js获取span标签的值
  20. OpenVPN设置客户端固定IP

热门文章

  1. git Eclipse项目不显示当前分支
  2. Ubantu下 docker的安装
  3. SQL Server的安装笔记
  4. ajax的底层前后台交互
  5. nw.js开发第一个程序(html开发桌面程序exe)
  6. canvas一周一练 -- canvas绘制太极图(6)
  7. LR事务、集合点
  8. A5. JVM 如何判断GC对象
  9. Opencv下双线性插值法进行图像放缩
  10. docker-compose 报错记录