前言
在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
展示的场景。
每个框架有每个框架的特点和使用场景,找到合适框架才是最好的框架
作者:zuoz
链接:https://juejin.cn/post/7140274032229744648
网友评论