android mvI架构梳理

发布于:2025-06-14 ⋅ 阅读:(23) ⋅ 点赞:(0)

\MVI(Model-View-Intent)是一种在 Android 开发中应用的架构模式,它将单向数据流思想发挥到极致,让状态管理变得更加清晰和可预测。

核心概念

MVI 架构由三个主要部分组成:

  1. Model:代表应用的状态(State),是不可变的。当有新的状态产生时,会生成一个新的 Model 替换旧的。
  2. View:负责渲染 Model 的状态,同时将用户的操作转换为 Intent 发送出去。
  3. Intent:代表用户的操作意图,是单向数据流的起点。
     

单向数据流

MVI 的核心是单向数据流,其流程如下:

  1. 用户在 View 上进行操作(点击按钮、输入文本等)
  2. View 将这些操作转换为 Intent
  3. Intent 被发送到处理逻辑(通常是 ViewModel)
  4. 处理逻辑根据 Intent 更新 Model
  5. 新的 Model 被推送到 View
  6. 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 配合流实现动态数据监听