我们都知道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这种观察者方法,能够在这些方法中向事件总线发送事件。
应用程序架构例如以下图所看到的:
从上图能够看出。模型(Model)和视图(View)不会主动调用Activity,同一时候模型(Model)和视图(View)之不发生直接的关系。二者之间的交互都统一通过Activity来进行。
稍后我们将看到。在IOS平台下。我们也会採用同样的架构。
在下一篇博文中。我们将以这个架构为指导,做程序開始时的Splash页面。然后我们会回过头来,描写叙述在IOS平台下。採用Swift 2.0来实现同样的功能。
大家的支持是我继续前进的动力,请大家多多支持:
银行账号:622202 0200 1078 56128 闫涛
我的支付宝:yt7589@hotmail.com