2015年12月24日
[TOC]
1、從MVP開始
MVP出現的前提就是減少了Activity的職責,簡化了Activity中的代碼,將復雜的邏輯代碼提取到了Presenter中進行處理。與之對應的好處就是,耦合度更低,更方便的進行單元測試。

1. 各部分之間的通信,都是雙向的。
2. View 與 Model 不發生聯系,都通過 Presenter 傳遞。
3. View 非常薄,不部署任何業務邏輯,稱為"被動視圖"(Passive View),即沒有任何主動性,而 Presenter非常厚,所有邏輯都部署在那里。
2、MVVM
說MVVM首先先提到標記語言,隨著20世紀初web的崛起,HTML跟JS這樣標記語言+程序語言的組合模式開始變得令人注目。逐漸推出的Flex、Sliverlight、QT、WPF、JSF、Cocoa等UI系統不約而同地選擇了標記語言來描述界面。
在這樣的架構中,view(或者說叫控件,不但是從依賴關系上跟程序的其他部件解耦,而且從語言上跟其它部分隔離開來)
然而這樣的系統架構中,MVC和MVP模式已經不能很好地適用了。微軟架構師John Gossman在WPF的XAML模式推出的同時,提出了MVVM的概念。

在安卓開發中,layout文件是靜態的,只能通過代碼進行修改,大量的事件綁定和finViewById以及視圖的邏輯充斥在Activity中,使Acticity顯得特別胖。
MVP雖然在一定程度上解決了Acticity代碼量龐大,實現視圖邏輯和視圖操作的解耦,但是他們還是需要大量的代碼對layout進行設置屬性,比如說ImageView的setImageBitmap或者TextView的setText,顯得特別啰嗦也很容易出錯
但是而在安卓的Databinding中,把一個layout里面的控件的某些屬性綁定對應的bean,把操作的控件看成bean對象,只需要對layout綁定的bean進行修改之后,layout就會隨之改變。
這里的bean就是MVVM中的Model,那么對bean進行邏輯處理的就是VM(ViewModel),這樣我們主需要關心M和VM之間的交互了。但是,還不能是實現雙向綁定,比如說,對一個EditText的text屬性綁定一個bean的屬性,那么對EditText修改之后他的bean不會隨之變化,當然可以自定義屬性解決這個問題。
下面就是layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- 配置變量,name字段為下面想要引用的類,type為全類名,
AS中快捷鍵ctrl+shift+alt+c -->
<data>
<import type="com.znke.hellodatabinding.test1.Person"/>
<variable
name="person"
type="Person"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 需要填充的字段用@{}表示 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:text="@{person.name}"
/>
</LinearLayout>
</layout>
一個布局文件就是一個ViewBinding對象,它包含了這個布局里面所有View和變量:
ActivityRecyclerviewBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_recyclerview);
注意,ActivityRecyclerviewBinding是系統自動生成的
然后看一下MVVM的示意圖

MVVM是MVP的升級版,只是把
presenter
變成了ViewModel
,并且MVVM支持綁定。