1、 Android Jetpack系列之MVVM使用及封装
2、Android Jetpack系列之MVVM使用及封装(续)
那么MVI
又是什么呢?看了一些关于MVI
的文章,大家都称MVI是(Model-View-Intent)
,其中Intent
称为意图(注意这里的Intent
并不是页面跳转时使用的Intent
),MVI本质上是在MVVM
的基础上将View
与ViewModel
之间的数据传递做了统一整合。
google
官方文档中并没有MVI
的说法,而是在之前的MVVM
架构基础上进行了升级,其主旨意思与MVI
很相近,为了保持一致,后续介绍的MVVM
升级版架构统一称之为MVI
架构。
MVI vs MVVM
新旧架构对比
-
旧版
MVVM
架构: -
新版
MVVM
或者称之为MVI
:
差异1、LiveData < T> 改为Flow< UIState>
关于LiveData
的缺点:
LiveData
的接收只能在主线程;LiveData
发送数据是一次性买卖,不能多次发送;LiveData
发送数据的线程是固定的,不能切换线程,setValue/postValue
本质上都是在主线程上发送的。当需要来回切换线程时,LiveData
就显得无能为力了。
Flow
可以完美解决LiveData遇到的问题,既可以多次从上游发送数据,也可以灵活地切换线程,所以如果涉及到来回切线程,那么使用Flow
是更优解。关于Flow
的详细用法,感兴趣的同学可以参见:Android Kotlin之Flow数据流
注:如果项目中还没有切换到Kotlin
,依然可以使用LiveData
来发送数据;如果已经切换到Kotlin
,那么更推荐使用Flow
来发送数据。
还有一点区别,LiveData
在旧版架构中传递的是单个实体数据,即每个数据都会对应一个LiveData
,很显然,如果页面逻辑很复杂的话,会导致ViewModel
中的LiveData
膨胀;新版架构中通过Flow
发送的统一为UIState
了,UIState
本质上也是一个data类
,不同的是UIState
会把View
层相关的实体状态统一管控,这样在ViewModel
中只需要一个Flow
来统一交互即可。
差异2、交互规范
新版架构中,提出了单向数据流来管理页面状态的概念:即数据的流向是固定的,整个数据流向是View -> ViewModel -> Model数据层 -> ViewModel获得数据 -> 根据UiState刷新View层
。其中,事件 Events
向上流动、状态 UiState
向下流动的。整体