继续创造,加快成长!这是我参与「日新方案 6 月更文挑战」的第14天,点击查看活动详情
前语
上一篇咱们了解了MVP事务架构在项目中的运用,这一篇咱们来了解一下MVVM事务架构。MVVM是我现在为止运用时间最长的一个事务架构,从开始的EventBus
完成View层和逻辑层的解耦到后来的咱们自己封装的调查者,再到现在的ViewModel
完成解耦。这一篇咱们重点说一下ViewModel的完成方法,它不是最好的,也不是独一无二的,它有缺陷也有借鉴而来的,但它却是咱们项目截止现在最适宜的。
在这套架构出来之前咱们在旧项目上完成过MVVM,那时是选用广播的思想进行完成的,后来发现这种完成方法坏处很多,像如何有用保护事情,如何避免内容走漏等等。直到19年新起项目的时候咱们决议从头设计一套适宜的架构,设计之初jetpack刚发布没多久,很多库都仍是Alpha版本。一开始我还挺担心jitpack会夭亡,毕竟谷歌也不是没有干过这种事,在团队成员沟通交流后咱们确认了jitpack作为新项目的技术基点。
概览
MVVM作为MVP演变而来的事务架构,从事务完成来说将原有Presenter层所完成的逻辑放到了ViewModel层,相同根据MVP的情况咱们不难看出事务臃肿转移到了ViewModel层,那又是如何来解决的呢?
功能
类型 | 功能 |
---|---|
M-Model | 模型层,首要用于数据的处理及存储,像网络恳求和本地存储数据恳求及处理等。 |
V-View | 视图层,首要用于UI款式的出现及处理,像xml布局和Activity中的控件及其展现作用等。 |
VM-ViewModel | 逻辑层,首要用于承载View层和Model层交互处理以及数据通信,像数据模型事务等。 |
技术点
- Lifecycle:生命周期感知组件,经过可执行操作来呼应别的一个组件。
- ViewModel:以生命周期的方法存储和管理界面相关的数据。
- LiveData:可调查的数据存储器类,仅更新处于活泼的生命周期状态的应用组件调查者。
- Coroutine:协程是供给编写异步代码的API,削减线程的开心。
- Room:本地数据存储,持久性库在 SQLite 上供给了一个笼统层。
- Hilt:依靠注入,将目标的初始化所需的依靠项经过抓取的方法注入。(替换Dagger时参加的)
- Flow:异步流,让事务像溪流一样链接起来。(这是后来参加的)
事务架构分层
层级 | 功能 |
---|---|
View层 | 视图层,视图烘托层,如xml,webview,flutter,compose等 |
ViewModel层 | 视图控制层,视图烘托条件事务。如展现内容数据容器,视图数据校验等 |
Repository层 | 数据仓库层,数据事务数据处理。如视图内容拼装,网络参数拼装等 |
Source层 | 数据源层,事务数据获取层。如网络恳求,本地数据库查询等 |
View层
定位是完成事务视图出现的相关逻辑,像xml的click事情,recyclerview数据烘托等等。仍是用activity或许fragment作为视图容器,xml的控件绑定选用的是viewbind。当时view层自动持有一个ViewModel的实例。
ViewModel层
定位是完成视图控制的相关逻辑,像click呼应什么样的事情,视图是否允许展现dialog等等。首要是继承ViewModel类,供给给View层可调查的LiveData数据,也是flow异步流发起和收集的当地。当时ViewModel层自动持有一个Repository层的实例。
Repository层
定位是完成为ViewModel层供给可展现的数据,像recyclerview应该展现那些数据,这一层首要是用作数据拼装,一个视图数据的展现或许来自不同的数据源,这时咱们能够拼装为一个可直接供视图展现的数据结构,从而减小ViewModel的数据处理压力,ViewModel只需要专心控制View层的逻辑即可。当时Repository层自动持有多个Source层实例。
Source层
定位是为事务供给数据源,这是与事务无关的一层,他只与Model层相联系,它经过向Model层索要数据,无论数据的来历是server仍是room,它只对外供给数据源,不关心下游的运用方法。能够说他是Model层向上引申的一层定义,旨在供给某一类数据源。
结语
这一篇咱们大概了解了当时项目关于MVVM的定位,以上的定义言语或许不能准确的表达它的定位。下一篇咱们将经过具体的实例来进一步论述这套事务架构。