使⽤Kotlin构建AndroidMVVM应⽤程序
概述
说到MVVM,⼤家都会想起前端的MVVM框架,相较于前端MVVM的⽕热,它在移动开发领域就不那么热门了。Google在2015年才推出DataBinding框架,起步较晚,⽽且2015年是MVP模式爆发的⼀年,2016年是各种热修复、插件化爆发的⼀年,它没赶上好时机。
PS:DataBinding和MVVM⼆者并不相同。MVVM是⼀种架构模式,⽽DataBinding是Android中实现数据与UI绑定的框架,是构建MVVM架构的⼀个⼯具,作⽤类似于增强版的ButterKnife。
⾃16年接触DataBinding以来,苦于这⽅⾯的知识较少,但是Databinding在使⽤过程中⼜⼗分便捷,所以⼀直以来都在不停探索怎样才能构建出合适的MVVM架构程序,在经过⼏次的项⽬重构之后,终于在近期结合Kotlin语⾔探索出了更适合Android的MVVM架构。
我们先来看看什么是MVVM,然后再⼀步⼀步来阐述整个的MVVM框架
MVC、MVP、MVVM
我们先⼤致了解下Android开发的创建模式
MVC
Model:实体模型、数据的获取、存储等等
View:Activity、fragment、view、adapter、xml等等
Controller:为View层处理数据,业务等等
从这个结构来看,Android本⾝还是符合MVC架构的。不过由于作为纯View的xml功能太弱,以及controller能提供给开发者的作⽤较⼩,还不如在Activity页⾯直接进⾏处理,但这么做却造成了代码⼤爆炸。⼀个页⾯逻辑复杂的页⾯动辄上千⾏,注释没写好的话还⼗分不好维护,⽽且难以进⾏单元测试,所以这更像是⼀个Model-View的架构,不适⽤于打造稳定的Android项⽬。
MVP
Model:实体模型、数据的获取、存储等等
View:Activity、fragment、view、adapter、xml等等
Presenter:负责完成View与Model间的交互和业务逻辑,以回调返回结果。
前⾯说,Activity充当了View和Controller的作⽤, 造成了代码爆炸。⽽MVP架构很好的处理了这个问题。其核⼼理念是通过⼀个抽象的View接⼝(不是真正的View层)将Presenter与真正的View层进⾏解耦。Persenter持有该View接⼝,对该接⼝进⾏操作,⽽不是直接操作View层。这样就可以把视图操作和业务逻辑解耦,从⽽让Activity成为真正的View层。
这也是现今⽐较流⾏的架构,可是弊端也是有的。如果业务复杂了,也可能导致P层太臃肿,⽽且V和P层有⼀定耦合度,如果UI有什么地⽅需要更改,那么P层不只改⼀个地⽅那么简单,还需要改View的
接⼝及其实现,牵⼀发动全⾝,运⽤MVP的同⾏都对此怨声载道。
MVVM
Model:实体模型、数据的获取、存储等等
View:Activity、fragment、view、adapter、xml等等
ViewModel:负责完成View与Model间的交互和业务逻辑,基于DataBinding改变UI
MVVM的⽬标和思想与MVP类似,但它没有MVP那令⼈厌烦的各种回调,利⽤DataBinding就可以更新UI和状态,达到理想的效果。
数据驱动UI
在使⽤MVC或MVP开发时,我们如果要更新UI,⾸先需要到这个view的引⽤,然后赋予值,才能进⾏更新。在MVVM中,这就不需要了。MVVM是通过数据驱动UI的,这些都是⾃动完成。数据的重要性在MVVM架构中得到提⾼,成为主导因素。在这种架构模式中,开发者重点关注的是怎样处理数据,保证数据的正确性。
关注点分离
常见的错误就是把所有代码都写在Activity或者Fragment中。任何跟UI和系统交互⽆关的事情都不应该放在这些类当中。尽可能让它们保持简单轻量可以避免很多⽣命周期⽅⾯的问题。MVVM架构模式下,数据和业务逻辑都处于ViewModel中,ViewModel只关⼼数据和业务,不需要直接和UI打交道,⽽Model只需要提供ViewModel的数据源,View则关⼼如何显⽰数据和处理与⽤户的交互。
通过以上简述和与MVC、MVP的对⽐,我们可以发现MVVM还是很有优势的,⽽如果再搭配Kotlin语⾔的话,可以说是如虎添翼了。
如何开始?
其实结构已经很清晰了,我们只需要做M-V-VM层各层应该做的事情,做到关注点分离。
M层 的关注点是怎么提供数据给ViewModel
android retrofitViewModel层 关注点是怎么处理数据(包括使⽤DataBinding绑定数据,以及控制loading、empty状态)
View层的关注点是显⽰数据,接收⽤户的操作,调⽤ViewModel中的⽅法
为了打造更适合Android的MVVM架构,使⽤到的技术有AOP、Dagger2、RxJava、Retrofit、Room和Kotlin,并遵循统⼀的命名规范和调⽤准则,保证开发时的⼀致性。
以下是我们现今的架构:
MVVM 创建⽂章详情界⾯
接下来我将展⽰⼀下M-V-VM三层之间如何协作,以⽂章详情页⾯为例
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论