详解
这几天掘金上铺天盖地的 MVI,但是看了都是用 mosby 写的,我就觉得费得用 mosby 吗?PublishSubject 简简单单的就能实现,本文例子是在以前的代码上改的,用的 java 大家见谅,另外欢迎喷,不喷不自在哈…
MVI 概念
MVI 是和 MVVM 一起出现的概念,是跟着 Rxjava 响应式思路衍生出来的一种想法
MVVM 我猜大家都熟悉,数据层传递 Livedata -> persenter -> 再到 UI 层去注册监听,这是个单向的过程,从 数据 -> UI 的过程:
一般 MVVM 我们都是这么写,但是也有的人写的更彻底,app 的交互是个双向过程,先从 UI -> 数据 再到 数据 -> UI,上面常见的方式我们只是实现了一边,更彻底的响应式改造是连点击事件都是响应式的,数据层注册监听按钮的点击事件,通过上水管道接受数据,远程数据返回后再通过下水管道返回数据:
一般没写这么麻烦的~
MVI 和双向 MVVM 的思路相同,区别就是 MVI 进一步抽象了 UI 的动作,也就是 MVI 中的 I - Intent,MVI 中把任何一个 UI 事件都看成一个响应式数据源,P 层的任务就是绑定注册 V 和 M 层的关系,就像热水器一样接通上下水管道:
MVI 中的这个 Intent 有自己的思想,Intent 把 UI 页面的任何变化都看成一个整体,用一个数据类型来表示,比如有一个 ViewState 对象里面有 loading,netError,success 各种表示页面状态的标志位,数据层返回的是这个 ViewState 而不再直接是数据了,UI 层根据 ViewState 的状态来显示不同的 UI 样式,这样 P 层就不用再写一堆控制 UI 显示状态的方法了,真正实现了 MVP 的分层思想,谁的事谁关心,当然 MVVM 也可以做到,但是一般 MVVM 里面都是直接返回数据的,真的把页面状态也封装进数据的没几个人
class NetViewState(
var loading: Boolean = false,
var success: Boolean = false,
var netError: Boolean = false,
var dataError: Boolean = false,
var dataNo: Boolean = false,
var message: String = "",
var data: BookResponse = BookResponse()) {
companion object Help {
@JvmStatic
fun loading(): NetViewState {
return NetView