一、简介MVI架构模式
- M:Model 数据层,包含应用数据和业务逻辑
- V:View 界面层,在屏幕上显示应用数据,包含与界面相关的状态和界面逻辑,根据界面状态对象更新UI,界面状态定义是不可变的。这样的主要好处是,不可变对象可保证即时提供应用的状态
- I:Intent, 处理界面事件(用户在与应用互动时生成的事件)
提醒:MVI架构遵循单向数据流 (UDF) 原则,在 UDF 中,状态仅朝一个方向流动。修改数据的事件朝相反方向流动。
二、单一数据源
在应用中定义新数据类型时,您应为其分配单一数据源 (SSOT)。SSOT 是该数据的所有者,而且只有此 SSOT 可以修改或转变该数据。为了实现这一点,SSOT 会以不可变类型公开数据;而且为了修改数据,SSOT 会公开函数或接收其他类型可以调用的事件。
此模式具有多种优势:
- 将对特定类型数据的所有更改集中到一处。
- 保护数据,防止其他类型篡改此数据。
- 更易于跟踪对数据的更改。因此,也就更容易发现 bug。
在离线优先应用中,应用数据的单一数据源通常是数据库。在其他某些情况下,单一数据源可以是 ViewModel 甚至是界面。
三、单向数据流
单一数据源原则常常与单向数据流 (UDF) 模式一起使用。在 UDF 中,状态仅朝一个方向流动。修改数据的事件朝相反方向流动。
在 Android 中,状态或数据通常从分区层次结构中较高的分区类型流向较低的分区类型。事件通常在分区层次结构中较低的分区类型触发,直到其到达 SSOT 的相应数据类型。例如,应用数据通常从数据源流向界面。用户事件(例如按钮按下操作)从界面流向 SSOT,在 SSOT 中应用数据被修改并以不可变类型公开。
此模式可以更好地保证数据一致性,不易出错、更易于调试,并且具备 SSOT 模式的所有优势。
四、本demo演示MVI架构的使用
4.1 技术摘要
- 应用架构指南
- ViewModel
ViewModel overview
ViewModel- androidx.lifecycle
- LiveData
- 网络框架
retrofit2 + 协程
协程上下文与调度器 中文文档
协程上下文与调度器 英文文档- 日志框架
okhttp3:logging-interceptor- 数据库
room- api
玩Android 开放API- Gradle依赖统一版本管理
Version Catalog
TOML官网- KSP
从 kapt 迁移到 KSP
KSP官网文档- TextInputEditText
- ViewBinding
Android Gradle 插件 3.6.0推出的新特性
Android Gradle 插件 4.0.0开始放在buildFeatures
4.2 提醒
- 创建ViewModel方式
在BaseActivity和BaseFragment里统一通过反射(getDeclaredConstructor().newInstance())创建ViewModel- 如果没有封装成统一的方式,独立创建ViewModel
在gradle里依赖androidx.activity:activity-ktx:xxx
在Activity里,可以通过 by viewModels()
在gradle里依赖androidx.fragment:fragment-ktx:xxx
在Fragment里,可以通过 by activityViewModels()
4.3 项目结构图
4.3.1 baselib
4.3.2 app
4.3.3 WXArticleViewModel.kt代码图
4.3.4 WXArticleViewModel.kt代码图
五、源码
点击查看gitee上的KotlinMVI源码demo
点击查看github上的KotlinMVI源码demo