概述
说到Android MVVM,就会联想到DataBinding框架。然而两者的概念是不一样的,不能混为一谈。MVVM是一种架构模式,而DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个工具。
网上关于MVVM框架的搭建和使用的文章很少,大多提到MVVM框架,就是在介绍DataBinding的使用。对于MVVM中各模块之间如何划分,如何定义,又是如何配合实现高度解耦的文章更是少之又少。大家看完后还是一头雾水,只是对MVVM有个大概的了解,并不很清楚如何上手。
接下来,我们先认识什么是MVVM,然后再一步一步来设计整个MVVM框架。
MVC、MVP简介
MVC、MVP和MVVM都是在安卓开发中经常使用的模式,我们在认识MVVM之前先回顾一下MVC和MVP。
MVC
- View:xml布局
- Model:数据层,负责数据交互、存储和实体类定义
- Controller:业务处理层
Android开发本身还是比较符合MVC架构的,但是Android中纯粹作为View的XML视图功能太弱,我们大量处理View的逻辑只能写在Activity中,这样Activity就充当了View和Controller两个角色,直接导致Activity中的代码臃肿、混乱,导致阅读困难、重用困难和维护困难。相信大多数Android开发者都遇到过一个Acitivty数以千行的代码情况吧!所以,更贴切的说法是,这个MVC结构最终其实只是一个Model-View(Activity:View&Controller)的结构。
MVP
- View:xml文件及对应的Activity或Fragment,负责界面展示和交互
- Model:数据层,负责数据交互、存储和实体类定义
- Presenter:负责View层和Model层之间的逻辑处理
前面我们说,Activity充当了View和Controller两个角色,MVP就能很好地解决这个问题,其核心理念是通过一个抽象的View接口(不是真正的View层)将Presenter与真正的View层进行解耦。Persenter持有该View接口,对该接口进行操作,而不是直接操作View层。这样就可以把视图操作和业务逻辑解耦,从而让Activity成为真正的View层。
不足的是,MVP模式中定义了大量的接口,使得代码结构变大和复杂;MVP是UI和事件驱动,需要手动调用大量的方法来进行实现,缺乏自动性。
所以我们迎来了MVVM框架,当然得首先感谢google爸爸提供得DataBinding,真的是很强大!
View:
View层负责和UI相关的工作,我们只在XML、Activity和Fragment写View层的代码,View层不进行业务处理,也就是我们在Activity不写业务逻辑和业务数据相关的代码。
更新UI通过数据绑定实现,尽量在ViewModel里面做,Activity要做的事就是初始化一些控件(如RecyclerView设置LayoutManager或者控件的显隐),View层可以通过数据来驱动更改UI,UI事件通过Command来绑定。
简而言之:View层不做任何业务逻辑、不涉及操作数据,UI和数据严格的分开。 **UI更新和事件相应全部使用数据绑定,也就是DataBinding来实现。**这就是MVVM和MVP、MVC很明显的不同之处。
ViewModel
ViewModel层做的事情刚好和View层相反,ViewModel只负责业务逻辑,不做任何和UI相关的事情。
同时DataBinding框架已经支持双向绑定,让我们可以通过双向绑定获取View层反馈给ViewModel层的数据,并对这些数据上进行操作。
事件的处理,我们也希望能把这些事件处理绑定到控件上,并把这些事件的处理统一化,为此我们通过使用BindingAdapter对一些常用的事件做封装,把一个个事件封装成一个个Command,对于每个事件我们用一个ReplyCommand去处理就行了,ReplyCommand会把你可能需要的数据带给你,这使得我们在ViewModel层处理事件的时候只需要关心处理数据就行了,具体见MVVM Light Toolkit 使用指南的Command部分。
Model
Model层不仅包括实体类的定义,还需要对数据进行处理和读写。例如:使用Retrofit或okHttp进行网络请求,或着如数据库操作等等。
优点:
- 数据驱动
- 低耦合
- 主线程更新UI
- 可复用性
- 方便单元测试
我们再来看下这张图:
简述下数据流走向:
View中使用DataBinding的Command来绑定事件和响应事件,触发网络请求;ViewModel进行分析处理,调用Model的数据请求方法;Model将收到的请求参数等信息封装,调用网络请求库;网络库(Retrofit等)与服务器进行交互;
服务器将json数据返回Retrofit等网络库,再返回到Model层中,ViewModel在回调中收到返回的实体类对象;
因为xml与实体类对象实现了双向绑定,实体类更新,使得UI更新!
转载自
https://blog.youkuaiyun.com/kisty_yao/article/details/79698291