Android开发框架MVC-MVP-MVVM-MVI的演变Demo
Android框架的历史演变
记得最开始入门Android的时候,还未流行MVP,都是MVC一把梭,后面工作了就是使用了MVP,当时学习的时候好难理解它的回调。
到目前主流的MVVM,其实就是MVP的升级版,再到最新的MVI使用意图传输,隔离各层级的直接调用。我算是经历了Android框架变迁的全过程。
这里记录一下各框架的简单Demo用例。
一. MVC框架
经典MVC分为:
Model 模型层 : 数据和网络
View 视图层 : 视图的展示
Controller 控制层 : 逻辑控制,调用模型驱动视图
一般我们是把一个xml看作一个View层, Activity看作一个Control层 , Model层则是由相关的数据操作类。
Model层:
Controller层:
XML就是View层,获取到信息展示到XML中。
这样分工其实也是很明确的,但是一旦逻辑过多,会导致Activity太臃肿。Activcity中又是Model又是View,耦合性太强,记得那时候一个Activity中上千行代码都是平平常常。
为了解决这个问题,大家开始使用MVP架构。
二. MVP框架
MVP框架的出现,各个模块权责分明,各干各的活,降低了耦合,减少Activity的臃肿。
Model层:还是MVC那个Model。
View层:接口定义由Activity实,用于操作相应的UI。
Presenter层:用于Model和View的桥梁,负责Model与View的交互
那更复杂的一点的,就是其中加入Contract契约类,把指定页面的Presenter和View等关联起来,方便维护。
View接口定义:
Presenter的实现:
Activity的实现:
当时MVP框架是火遍一时,当时面试要不会这个,那都不好意思说是做安卓的。
虽然它有一些缺点,比如太复杂,每次都要写重复的View,修改麻烦,回调地狱,数据交互体验不佳,无法感知生命周期,重建页面无法自动恢复数据,耦合还是有很多,等等。但是在当时没有替代品的选择下,它是当之无愧的王。
但是当谷歌出了Jetpack,当ViewModel+LiveData+Lifecycles的出现给了我们新的选择 MVVM框架开始出现并迅猛发展。
三. MVVM框架
这里先说一点有争议的点。 有些人认为,只要用上ViewModel+LiveData这些就算MVVM框架 Model+View+ViewModel嘛。 有些人认为,MVVM的意思是数据驱动,最大的亮点是数据绑定,使用DataBinding的才算MVVM。 其实这个也没有官方的定义,世上本无框架,用的人多了才出现框架名字,约定俗成的东西,你想怎么定义就怎么定义,那我姑且称为前者为半MVVM后者为MVVM吧
3.1 半MVVM框架
其实可以理解为MVP的升级版,去掉了View的接口回调,保存了ViewModel的特性
Model层:还是MVC那个Model。
View层:Activity,用于操作相应的UI。
ViewModel:还是MVP那个Presenter,只是用ViewModel实现。
ViewModel实现: 可以看到代码确实相比MVP少了很多
Activity的实现:
3.2 带DataBinding的MVVM框架
特别是现在kotlin那种直接拿id使用的插件已经被官方标记为过时,还不赶紧用DataBinding或ViewBinding?
ViewModel实现:
Repository的实现:其实和Model差不多的意思,数据仓库而已,下面的一些注解是用到了Hilt依赖注入,不用直接new对象也是可以的,不要在意一些细节。
Activity的实现: 内部做了一些基类的封装,事件处理封装为对象,viewmodel和事件对象在xml中做了引用
Xml的实现: 注意引用指向的包名要写对,写对了可以直接跳转过去的。
这样就完成了一个基于数据驱动的DataBinding的MVVM。 如果上面一些代码如果看不太明白,后面我可能会出DataBinding的封装并开源。
截止到发稿日期为止,目前市面上最流行的还是MVVM框架,此框架唯一的槽点可能就是Databinding的不好调试吧,一旦出问题,有时候报错信息莫名其妙的,没有指向XML中某个数据或语法的错误,需要对DataBinding有一定的了解。 不过AS现在貌似越来越智能了,报错信息都还指向蛮清晰的。MVVM完全可用的。
四. MVI框架
由于是出来没多久,具体是不是叫MVI框架这个名字还不确定,大家都这么叫,姑且就叫MVI吧。伴随Compose出现的框架,主流用于Compose应用。
MVI框架是由Model View Intent组成的。可以算上MVVM的升级版,在之前我们都是通过在Activity中直接调用ViewModel的方法,现在改为发出操作指令,由ViewModel解析指令,调用对应的方法,回调给Activity。
比如一个DemoActivity需要获取行业数据,学校数据,等。那么就可以把数据和操作都封装成指定的对象。
Activity调用相关的接口就不是直接调用ViewModel的方法,而是:
那么ViewModel就需要解析指令:
完整的代码如下:
ViewModel的实现:
Activity的实现:
注意,有些MVI的写法是回调给Activity的方式也是用对象封装如我注释的代码:
也可以使用LiveData返回,我这里使用扩展方法observeState方法来监听,这样可以保证只有你监听的对象发生了变化才会收到回调。这个扩展方法在MVVM框架也能使用。
扩展方法如下:
太干了,一张图都没上,最后总结一下:
世界上本无框架,用的人多了就成了框架,适合自己的才是好的。不是一定说出了最新框架我就要用最新的框架,理解之后再使用才能得心应手。
个人目前平时开发中用的也是MVVM框架。后期会出一些MVVM的封装和用法开源。
以上就是Android开发框架MVC-MVP-MVVM-MVI的演变Demo的详细内容,更多关于Android框架MVC MVP MVVM MVI的资料请关注编程学习网其它相关文章!