MVVM架构在Android开发中的应用

2020-11-24 17:40潘凤江苏联合职业技术学院淮安生物工程分院
数码世界 2020年3期
关键词:布局组件界面

潘凤 江苏联合职业技术学院淮安生物工程分院

一、引言

从功能手机到智能手机,从3G到4G再到如今的5G,手机中的APP越来越丰富,提供的功能越来越强大,涉及的领域越来越广。在这背后,离不开移动生态和APP开发技术的不断发展。在移动端操作系统市场中,Android操作系统占比超过了百分之七十。这几年来,Android操作系统在不断地迭代更新,同时,Android应用架构也不断发展。最初的一代架构是MVC,但是Activity过于臃肿;为了解决该问题,出现了二代架构MVP,新增了presenter层,作为控制中心,分担原来Activity中的部分功能,处理View于Model间的交互和业务逻辑;如今Android主流应用架构是MVVM,MVVM的出现解决了MVP架构中View层大量接口和实现类等问题,更加灵活高效。

二、概述

MVVM架构共分为三层:Model层、View层、ViewModel层。Model表示模型层,主要负责获取视图层所需要的数据,数据源通常是网络和本地数据库。View层是视图层,主要负责界面的绘制和交互,Android项目的View层通常是XML和Activity;ViewModel层是视图-模型层,主要负责业务逻辑的处理,串联View层与Model层间,当Model层更改时,ViewModel层反馈给View层,引发页面的刷新。Android项目中引入MVVM架构可以带来以下几点优势。

1.各层级低耦合

MVVM架构中,数据模块和界面模块是相互独立的,通过ViewModel建立关联。单纯从数据的角度来看,Model负责提供数据,ViewModel负责处理数据,View负责展示数据。View层想展示什么样的样式,完全由自己决定。如果View层的样式发生变化,只要数据格式不变,那么ViewModel层和Model层就不需要做任何改动。如果Model数据源发生了变化,只要数据格式不变,那么View层也不需要做任何改动。而在MVC或者MVP架构中,当界面样式改变时,可能就需要改变获取控件的方式,改变更新界面的接口等等。

2.双向绑定、数据驱动

在MVVM架构中,可以通过数据绑定框架实现数据和控件的双向绑定,当数据改变时会自动驱动View层更新,View层控件改变时可以自动反馈到数据上,这样ViewModel层可以专注于处理数据和业务逻辑,不需要去关注View层的逻辑,比如如何获取用户的输入,如何更新界面,如何获知用户的交互事件等等。View层和ViewModel层之间通过数据进行串联,一方改变都会自动影响另外一方。每一层只关注自己的事情,整个项目的结构非常清晰明了。

3.团队协作,提高效率

在MVVM架构下,各层级之间的耦合程度很低,所以可以根据层级对整个项目进行划分,进而明确地分工,这样极大地提高了个人和整个团队的开发效率。

4.可复用性

如果对于同一份数据,需要多种样式进行展示,那么同一个ViewModel就可以供多个View使用。如果由于需求的变化导致样式不断变化,那么我们只需要更改对应的View层就可以了。

5.易于测试

由于ViewModel层和View层是相互独立的,一个专注于数据和业务逻辑的处理,一个专注于界面的绘制和交互,那么开发人员在做单元测试的时候,可以对两个层级分别进行测试,极大地方便了测试。

6.优化代码

Android中findViewById等模式化代码无需手动编写,MVVM中的数据绑定框架可以直接完成该工作,极大地提高了工作效率,同时还可以提高XML布局文件的解析速度。

三、应用

2015 年谷歌在Google I/O上提出了Data Binding库,目的是减少Android开发中的大量模板代码(setText等),增加代码及逻辑清晰度,提高开发效率和维护效率。同时,这也意味着,在Android开发中支持MVVM的开发模式,Data Binding可以使得数据对象直接绑定到XML布局文件中,数据发生变化时会直接反映到View上;View状态发生变化时也会反应到数据上。Android项目中使用Data Binding搭建MVVM架构,需要以下几个步骤:

1.利用Data Binding搭建View层。引入Data Binding框架后,XML布局文件和原始文件相比,增加了layout标签和data标签。data标签用来绑定数据对象,这样布局标签就可以直接使用变量中的属性。Activity中需要使用Data Binding绑定对应的布局文件和数据对象,数据对象需要实现Observable接口,这样数据对象就有了更新通知能力,一旦数据层的对象发生变化,View层就会自动完成相应的变化。

2.搭建ViewModel层。ViewModel层主要负责业务逻辑的处理,持有ObservableField等View层所需要的数据对象,还有Model层的对象。通过Model层对象调用接口获取数据,获取数据成功后给ObservableField等数据对象赋值,一旦数据的值发生变化后,View层对应的页面就会刷新。

Data Binding搭建的MVVM架构有很多优点,比如双向绑定技术可以让数据的一致性很好、增强了View层和ViewModel层联动性、减少了很多模式化代码、自动判空技术减少了低级错误的发生等等。但是,Data Binding框架也有一些缺陷,首先Data Binding框架对XML布局文件的侵入性比较大,增加了学习成本,同时还影响了XML布局文件的复用性;其次,由于XML布局文件无法进行调试,而数据绑定让一部分逻辑转移到了XML布局文件中,所以增加了代码调式的难度,可能会出现BUG定位困难的情况。还有,Data Binding框架是基于数据驱动的,当某个模块的业务逻辑比较复杂的时候,那么Model层的数据往往会比较大。但是数据只有在页面销毁的时候统一释放,而不能根据View的生命周期释放,所以总的来说,项目占用的内存增大了。

在这之后,谷歌在2017年Google I/O大会上宣布了一个全新的架构组件Android Architecture Components,我们后面简称AAC。Google官方对该框架的说明是:这是一个帮助构建稳定,易于测试和易于维护的App架构的库。该框架主要包含ViewModel、LiveData、Room三个核心组件。

1.ViewModel组件

在以往的项目架构中,由于没有ViewModel这一层,所以相关数据都存储在Activity或者Fragment中,而Activity和Fragment都有自己的生命周期,在特殊的情况下会发生销毁或者重新创建,这时候存储在Activity或者Fragment中的数据会随着页面的销毁而消失,虽然Activity 可以使用 onSaveInstanceState方法存储和恢复相关的数据,但是这只适用于少量的数据。AAC框架中的ViewModel组件很好地解决了这个问题,ViewModel组件旨在以注重生命周期的方式存储和管理界面相关的数据,它能够承担保存数据的责任,把数据从界面中分离出来。同时,ViewModel也有自己的生命周期,和Activity、Fragment等组件的生命周期相匹配,这样当遇到界面销毁重建的情况时能够很好地保存数据,然后及时地恢复到界面上。

2.LiveData 组件

LiveData 能够感知Activity、Fragment等组件的生命周期。当Activity等组件销毁时,LiveData也会被退订,这样就有效地避免部分内存泄露问题。LiveData组件把View层和ViewModel层串联了起来,一旦数据发生了变化,就会通知View层,界面便会做出响应。

3.Room 组件

Room组件是在Android本地数据库基础上封装的一个组件,可以提供强大的数据库功能。Room组件在MVVM架构中不是必须的,可以根据自己项目的需求选择。

我们利用AAC框架可以很轻松地搭建一个MVVM架构的项目。搭建流程主要是:ViewModel组件作为MVVM架构中的ViewModel层,Activity和XML布局文件作为View层,LiveData作为可观察的数据存储器类在ViewModel层被创建,在View层中被观察,从而完成View层和ViewModel层的绑定。对比单纯Data Binding框架搭建的MVVM架构,AAC框架更加地完善和合理,对于Android开发者来说更加地友好。当然,也可以在AAC框架的基础上结合Data Binding框架,这需要根据项目的具体情况进行考量。

四、结束

总的来说,架构的引入目的是为了使项目结构更加合理,一个合理的架构可以使项目模块内部高聚合、模块之间低耦合。在项目开发的过程中,可以让开发人员只需要专注于某个模块或者某个业务,分工更加地合理,极大提高个人开发效率和团队的开发效率。架构的引入往往并不意味着代码量的减少,甚至可能会使代码量增多,因为我们引入项目架构的目的是为了项目在逻辑上更简单,让整个项目的质量、可扩展性、可维护性等得到提高。MVVM架构的诸多优点可以让项目稳健性更强、可测试性更好、可维护性更高。

猜你喜欢
布局组件界面
无人机智能巡检在光伏电站组件诊断中的应用
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
微重力下两相控温型储液器内气液界面仿真分析
先进纤维材料战略布局
3月光伏组件出口量增长164.6%至7.49GW!单价创新低
国企党委前置研究的“四个界面”
一种嵌入式软件组件更新方法的研究与实现
扁平化设计在手机界面中的发展趋势
商用WiFi蓄势待发BAT360谨慎布局前景存疑
Lumileds汽车照明:新布局下的新思路