\MVI(Model-View-Intent)是一种在 Android 开发中应用的架构模式,它将单向数据流思想发挥到极致,让状态管理变得更加清晰和可预测。
核心概念
MVI 架构由三个主要部分组成:
- Model:代表应用的状态(State),是不可变的。当有新的状态产生时,会生成一个新的 Model 替换旧的。
- View:负责渲染 Model 的状态,同时将用户的操作转换为 Intent 发送出去。
- Intent:代表用户的操作意图,是单向数据流的起点。
单向数据流
MVI 的核心是单向数据流,其流程如下:
- 用户在 View 上进行操作(点击按钮、输入文本等)
- View 将这些操作转换为 Intent
- Intent 被发送到处理逻辑(通常是 ViewModel)
- 处理逻辑根据 Intent 更新 Model
- 新的 Model 被推送到 View
- View 根据新的 Model 更新 UI
这个流程形成了一个闭环,数据总是沿着一个方向流动,使得状态变化可预测。
实现方式
配合Android 架构组件(Architecture Components)
ViewModel
ViewModel 可以承担起业务逻辑的职责,让 Activity 和 Fragment 只负责处理 UI 渲染。
ViewModel 的生命周期比 Activity 和 Fragment 更长,它会在 Activity 或 Fragment 销毁后继续存在,直到相关的 UI 控制器彻底离屏。
ViewModel 中启动一个协程来执行网络请求,即使 Activity 被销毁,协程也不会立即停止,而是会在 ViewModel 销毁时才会被取消。
ViewModel 可以在同一个 Activity 的多个 Fragment 之间共享数据
ViewModel 通常与StateFlow 结合使用,以实现数据的响应式更新
协程
轻量高效,资源占用低
单线程运行多协程:一个线程可同时处理数千协程,协程挂起时释放线程资源,避免线程阻塞和上下文切换开销128。
内存消耗低:协程栈内存仅为线程的千分之一,适合高并发场景(如网络请求池)
异步代码同步化,消灭回调地狱
通过 suspend
函数和协程构建器(如 launch
/async
),用顺序代码风格编写异步逻辑,彻底规避嵌套回调
结构化并发,生命周期自动管理
协程作用域(如
viewModelScope
)与组件生命周期绑定:当ViewModel
或Activity
销毁时,其关联协程自动取消,避免内存泄漏父子协程异常传播:子协程失败自动取消父协程(协同作用域),或独立失败不影响父协程(主从作用域)
线程切换无痛化
Dispatcher 精准控制协程执行线程
健壮的异常处理机制
通过
CoroutineExceptionHandler
集中捕获全局异常async
/await
结合try-catch
处理局部异常,避免崩溃
流
- StateFlow:作为状态容器,提供自动去重、状态缓存和 UI 自动刷新功能,适合表示应用的当前状态。
- SharedFlow:作为事件流处理器,提供灵活的重播策略和背压处理,适合表示一次性事件和需要自定义通知行为的场景。
room
项目复杂的情况下可以加入room 配合流实现动态数据监听