我正在参与掘金创作者训练营第6期, 点击了解活动详情
Android开发之浅淡MVI框架
前言
在Android开发中有许多框架框架MVC、MVP和MVVM等,就MVVM框架更是被Google官方推荐,那么为什么还需要MVI框架呢?先卖一个关子,后面再讲,为了我们更好的了解MVI框架,我们先回顾一下其他框架。
MVC
MVC是最新推出的框架主要为以下几个角色
- View(视图层):在Android就是
xml文件和代码创建的View部分 - Controller(控制层):主要负责业务逻辑,在Android中
Activity也属于Controller层,又要添加代码逻辑,又要控制View层显示 - Model(模型层):主要负责数据的处理,如网络请求、数据库、计算等操作
优点:
- 耦合性低,视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码。重用性高
缺点:
View和Controller连接过于紧密,可读性、健壮性、可拓展性都大打折扣,也不便于测试
MVP
MVP框架在MVC框架上进行了优化,主要一下集合角色:
- View层:只负责
UI相关操作,Activity也属于View层,使用Presenter层进行与Model的交互 - Presenter层:主要负责业务逻辑,通过接口的形式与View层交互
- Model层:主要负责数据的处理,如网络请求、数据库、计算等操作
优点:
- 模型与视图完全分离,我们可以修改视图而不影响模型
Presenter与View的交互是通过接口来进行的,有利于添加单元测试
缺点:
-
随着业务逻辑增多,需要增加大量接口,会有大量繁琐的回调
-
Presenter里持有了Activity对象,所以可能会导致内存泄漏或者view空指针的风险
MVVM
MVVM框架是把MVP中的Presenter变成了ViewModel,和MVP基本一致,我们看看MVVM中的角色:
- View层:主要负责
UI相关操作,与MVP中View层一致 - ViewModel层:主要负责业务逻辑,
View层与Model层的交互 - Model等:主要负责数据的处理,如网络请求、数据库、计算等操作
MVVM通过DataBinding进行View层与Model层双向绑定,当我们Model层发生数据变化时,自动刷新View层UI,可以理解为MVP模式的自动化
优点:
- 利用观察者模式和数据绑定,减少写回调接口的过程,代码和逻辑和更简洁清晰
缺点:
- 随着后期功能不断增加,
ViewModel中的代码量会越来越多
MVI
MVI是什么
MVI是最近被引入Android的。受Cycle.js框架的思路影响,是基于单向圆柱流的原理进行工作的。框架中主要以下面几个角色为主:
-
Model层:这里的
Model不是其他框架中的Model层,在MVI框架中表示存储UI的状态 -
View层:在
MVI中View层主要是接口,负责相应UI的状态 -
Intent层:在
MVI中Intent(和Android中的Intent不是同一个)主要负责传递UI状态
MVI数据流
当用户进行操作时,程序会以Intent的的形式通知Model层,Model层会对这个UI状态做处理在回调View层进行UI的状态刷新,数据永远都是一个环形结构且单向流动,请看下图:
MVI的优缺点
优点:
-
UI的所有变化来自State,所以只需聚焦State,架构更简单、易于调试 -
数据单向流动,很容易对状态变化进行跟踪和回溯
-
State实例都是不可变的,确保线程安全 -
UI只是反应State的变化,没有额外逻辑,可以被轻松替换或复用
缺点:
-
所有的操作最终都会转换成
State,所以当复杂页面的State容易膨胀 -
State是不变的,每当State需要更新时都要创建新对象替代老对象,这会带来一定内存开销
MVI总结
MVI框架是在MVVM框架的基数上,规定了数据的单项流动,类似于Flutter、Compose等主流框架的写法,非常适合在UI展示的场景。
每个框架有每个框架的特点和使用场景,找到合适框架才是最好的框架