一、背景
- MVI在架构分层上和MVP没有本质区别,但区别主要体现在架构风格和编程思想上
- MVI风格
- 面向意图,响应式编程
- 状态模式 + 流处理思想 = 单向不可变数据流
- 统一状态源
- 恢复现场:进程重生后,堆栈中返回,屏幕旋转等
- 可调试、可重现。日志中记录输入、状态、输出就可以据此复现问题
- 可测试。
- 缺点:对于初状态需要关注
- MVP、MVVM有什么问题?
- M、V、P可能各有各的状态
二、MVI - Model-View-Intent
- MVI是一种响应式和流式的处理思想,将意图事件(用户操作),通过函数转换为特定Model(状态),将其结果反馈给用户(渲染界面)。
- 抽象下来得到intent(),model(),view() 三个方法
- intent() 即意图,接收用户的输入(即UI事件,如点击事件)把意图和相关参数封装为数据结构,传递给model()方法。传递意图的接口是统一的,而不像MVP持有Presenter,并调用Presenter的多个接口。
- model() 不同于一般的model,这里说的model相当于状态模型里的一种状态,model内部的逻辑是不可变的,这能保证状态逻辑的一致性,同时降低系统的复杂性。
- view() 接收model传来的state渲染UI
MVI跟MVP的区别是,前者是面向意图编程,后者是面向接口编程
三、MVI的演进版
基本类
- Intent
- Data class
- V层的意图
- 强调的是交互意图
- IntentFilter
- ObservableTransformer<Intent, Action>
- 对UI意图进行过滤和转化为业务逻辑Action
- Action
- Data class
- 包含了该业务逻辑需要处理的信息的类
- 类似EventBus的Event
- 强调的是业务意图
- Processor
- ObservableTransformer<Action, Result>
- 执行实际业务
- Result
- Data class
- 包含UI通知状态 UiNotificationStatus:成功、失败、正在等待结果
- 成功时按需携带结果数据
- 失败时携带异常
- Reducer
- 我们把他翻译成 状态缩减:多个状态(Model)缩减成一个。类似于scan方法
- 更新状态,输出State给View渲染UI
- State
- Data class
- 包含渲染View所需要的所有信息