关于android中的MVVM模式,你须知道的事情

英文原文: http://www.willowtreeapps.com/blog/mvvm-on-android-what-you-need-to-know/ 

今年的I/O大会上谷歌介绍了一个非常牛逼的新框架,该框架可以让你将view和一个对象的对field绑定。当field更新的时候,framework将收到通知,同时view也会自动更新。

这种机制非常强大,让我们得以使用一种在Windows上已经使用多年的开发模式-Model-View-ViewModel (MVVM)。在开始编码之前,了解关于这种模式的的基本概念以及对app的好处也是很重要的。

MVVM模式包含了三个部分:

  • Model – 代表你的基本业务逻辑

  • View – 显示内容

  • ViewModel – 将前面两者联系在一起的对象

一个ViewModel接口提供了两个东西:动作和数据。动作改变Model的下层(click listener,监听文字改变的listener等等),而数据则是Model的内容。

比如,为一个拍卖页面服务的ViewModel可能被作为数据呈现:item里的一张图片,标题,描述,价格。也可能作为动作呈现:投标,购买或者联系卖家。

在传统的安卓架构中,controller负责推送数据给view。在Activity中findview,然后在它上面设置内容。在MVVM中,ViewModel在改变内容之后通知binding framework内容发生了改变。然后framework自动更新和那些内容绑定的view。这两个组建只是通过ViewModel松耦合在一起。

这种设计模式之所以牛逼,除了明显智能化了的View之外,还方便了测试。

因为ViewModel不在依赖于View了,你可以在没有View的情况下也能测试ViewModel。在合适的依赖注入的帮助下,测试就会变得非常简单。

比如,在一个测试用例中,我们不将VM和一个真实的View绑定,而是直接创建一个VM,给它一些数据,然后在上面调用操作,以确保数据的变化是正确的。比如刚刚的拍卖案例中,你可以创建一个带虚拟(模拟的)API服务的VM

,让它载入任意的item然后在上面调用拍卖的行为,以确认结果数据是正确的。所有这些工作都不必和一个具体的View交互。

而在测试view的时候,我们可以创建一系列带有预先设置好数据(比如依赖于网络调用的或者数据库内容的)的模拟model,然后观察在不同的数据集合面前view是如何表现的。

希望这篇文章能让你对MVVM模式有个更好的理解,后面的文章中我们将指出实现这种模式的一些细节问题,以及binding framework的要点和技巧。