=================================================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,後面會陸續講解它的運用。