我们都知道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形式实现。当视图中产生一个事件,如用户点击某按钮,这时需要触发一个事件,这时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