=================================================android
在2015年谷歌I/O大会上介绍了一个新的框架,就是DataBinding,而DataBinding是什么呢?根据英文翻译成中文就是数据绑定。数据库
说DataBinding以前先说一下什么是MVVM?从Android诞生到如今已经十多年,也陆陆续续出现了如今最主流的MVC,MVP,MVVM三大代码架构开发模式。下面简单分析下这三者开发模式的特色和优缺点。bash
MVC全名是Model View Controller是模型(model),视图(view),控制器(controller)的缩写。架构
M:Model是对应用状态和业务功能的封装,能够将它理解为同时包含数据和行为的领域模型,一般模型对象负责在数据库中存取数据。mvc
V:View是应用程序中处理数据显示的部分,就是实现可视化界面的呈现并捕捉用户的交互操做,在Android中,他能够是一个Activity,一个Fragment,一个Dialog。View能够直接调用Model查询状态信息,Model也能够在本身的状态发生改变时,主动通知View。一般视图是依据模型数据建立的。框架
C:Controller是应用程序中处理用户交互的部分。是M和V之间的链接器,用于控制应用程序的流程。View捕获用户交互操做后直接发给Controller,后者完成相应的UI逻辑。若是须要涉及业务功能的调用,Controller会直接调用Model及修改Model状态。Controller也能够主动控制原View或者建立新的View对用户交互操做予以回应。一般控制器负责从视图读取数据,控制用户的输入,并向模型发送数据。ide
下面经过一张图来显示这三者的关系: 布局
发现MVC,View是能够直接访问Model,那么View里会包含Model的信息,不可避免的也包含一些业务逻辑。在MVC模型里,更关注的Model改变,而同时有多个对Model的不一样显示,即View。因此,在MVC模型里,Model不依赖于View,但View是依赖于Model。那么如今想一想,对Android来讲,activity基本承担来view层和controller层两种角色,而且和model层耦合严重,在逻辑复杂的界面维护起来很麻烦。那么这时候MVP出来来,切断View和Model之间的关系。单元测试
MVP全名是Model-View-Presenter是模型(model),视图(view),展现器(presenter)的缩写。测试
M和V上面已经解释过来,如今解释p:presenter Presenter是从Model中获取数据并提供给View层,简单的就是当View须要去更新数据时,首先找Presenter,Presenter而后去向Model请求数据,从Model获取数据以后通知Presenter,Presenter再通知View去更新数据。简而言之:返回什么数据给View。
下面经过一张图来显示这三者的关系:
从上图能够看出MVP的优势:
1.严格禁止View和Model间的交互,必需经过Presenter来完成。Model的独立性获得来真正的体现,它不只仅与可视化元素(View)的呈现无关,与UI处理逻辑也无关,使用MVP的应用是用户驱动而不是Model驱动,因此Model不须要主动通知View。
2.MVP模式中的V表明的是一个接口,一个将UI界面提炼而抽象出来的接口。接口意味着任何实现来该接口的界面都可以复用已有的Presenter和Model代码。是真正意义上的隔离View的细节和复杂性的模式,下降来Presenter对View的依赖。好处就是在Presenter的UI处理逻辑变得易于测试。
若是说MVP是对MVC的进一步改进,那么MVVM则是思想上的彻底变革。 MVVM全称是Model-View-ViewModel。
MVVM类型MVC和MVP,可是比这两个更增强大。MV-VM对比MVP,实际上就是将Presenter层替换成了ViewModel层。MVVM是以“数据模型数据双向绑定”的思想做为核心,所以在View和Model之间没有联系,而是经过ViewModel进行交互,并且Model和ViewModel之间的交互是双向的,所以视图数据的变化会同时 修改数据源,并且数据源数据的变化也会当即反应到View上。
ViewModel层所须要作的就是彻底跟逻辑相关的代码,彻底不涉及到UI,当数据变化时,直接驱动UI的改变,中间省去了冗余的接口,在ViewModel层编写代码中,要求开发者须要将每一个方法尽量作的功能单一,不与外部有任何的联系,提升了代码的健壮性方便后期的单元测试。
一样下面经过一张图来显示三者的关系:
其实除了很是熟悉的Model,View和ViewModel这三个部分,在MVVM的实现中,还引入来隐式的一个Binder层,而声明式的数据和命令的绑定在MVVM模式中就是经过它来完成的。
从MVC架构模式到MVVM,从分离层到展现模型层,通过几十年的发展,MVC架构模式出现了各类各样的变种,而且在不一样的平台上有着本身的实现,开发者能够根据现实的状况去和各自的优缺点采起用什么模式进行开发。
上面说到MVVM是以“数据模型数据为绑定”的思想为核心,View和ViewModel会有一个隐式的BInder层。而他们是以什么来实现单向或者双向绑定呢?就是经过DataBinding这个框架来实现的,是实现UI和数据绑定的框架,作到UI和数据的相互监听,开发者的任务分配很明确,负责ViewModel的开发者不用考虑UI怎么实现的,提升来代码的开发效率和后期出现问题跟踪的准确性。
下面经过一个小例子来入门DataBinding
在module级别的build.gradle上添加DataBinding的支持: 注意:若是要在library中使用,那么使用该library也要在build.gradle添加支持。
android{
dataBinding{
enabled = true
}
}
复制代码
下面建立一个名为User的对象
public class User {
//名字
private String name;
//是否男的
private boolean isMale;
//年龄
private int age;
public String getName() {
return name;
}
public User(String name, boolean isMale, int age) {
this.name = name;
this.isMale = isMale;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public boolean isMale() {
return isMale;
}
public void setMale(boolean male) {
isMale = male;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
复制代码
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.android.databinding.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
<!-- boolean 要转为String来显示 否则编译异常-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.isMale)}" />
<!-- age是int类型 必须转化为String 否则编译异常-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.age)}" />
</LinearLayout>
</layout>
复制代码
能够看到布局文件和以前的xml不一样,根节点变成了layout,而在layout的子节点中分红两部分,第一部分是data节点,data表示建立变量,data的节点做用是链接View和Model的桥梁;而第二部分才是以前开发的根节点。在data节点下又定义了一个variable,variable表示声明的变量,其中name表示变量名,type表示变量类型,这样值就能够轻松传到布局文件中。注意控件TextView没有定义id,是在text的时候用了@{}(用@{bean.xxx})的这样的语法表达式和数据user实现绑定。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
User user = new User("狗狗",true,24);
binding.setUser(user);
}
}
复制代码
发现没有了控件的初始化findViewById或者butterknife,也没有控件的设置数据。绑定布局文件由DataBindingUtil.setContentView代替setContentView。经过binding.setUser(Bean)和variable进行绑定。 注意:在/build/generated/source/apt/debug/comapt/debug/com.android.databinding/databinding/能够看到ActivityMainBinding。这个类的生成的规则是activity_main --> ActivityMainBinding,fragment_main --> FragmentMainBinding。就是第一个单词首字母大写,第二个单词首字母大写,最后都会拼上Binding。 实际结果以下:
Android Stdio中是靠gradle来管理构建项目的,咱们知道一个项目的构建须要执行不少的task(任务),有不少task系统预先定义好的,如:build task,clean task。而Databinding task也是系统预先定义的,在默认状况下,咱们没有开启dataBinding{enable = true},所以没有在task列表里,当咱们开启dataBinding后,就会执行相关的task来检查而且生成dataBinding相关的代码。
这个类是系统自动生成的,默认状况下,系统会使用Android Stdio为咱们自动生成的databinding相关的代码,可是你会发现不能看到源码。能够在上面所说的build路径下进行源码查看或者手动编译代码。
dataBinding主要的优点在于减小Activity和Fragment层的代码,再也不使用findViewById,xml文件从以前的展现布局到如今能够进行一些操做。这篇文章只是初识DataBinding,后面会陆续讲解它的运用。