2015年12月24日
[TOC]
1币狠、從MVP開始
MVP出現(xiàn)的前提就是減少了Activity的職責(zé)负懦,簡化了Activity中的代碼失暴,將復(fù)雜的邏輯代碼提取到了Presenter中進(jìn)行處理酪我。與之對應(yīng)的好處就是,耦合度更低讹剔,更方便的進(jìn)行單元測試。
![MVP](https://raw.githubusercontent.com/liucloo/HelloDatabinding/master/img/mvvm/mvp.png)
1. 各部分之間的通信详民,都是雙向的延欠。
2. View 與 Model 不發(fā)生聯(lián)系,都通過 Presenter 傳遞沈跨。
3. View 非常薄由捎,不部署任何業(yè)務(wù)邏輯,稱為"被動視圖"(Passive View)谒出,即沒有任何主動性隅俘,而 Presenter非常厚,所有邏輯都部署在那里笤喳。
2为居、MVVM
說MVVM首先先提到標(biāo)記語言,隨著20世紀(jì)初web的崛起杀狡,HTML跟JS這樣標(biāo)記語言+程序語言的組合模式開始變得令人注目蒙畴。逐漸推出的Flex、Sliverlight呜象、QT膳凝、WPF、JSF恭陡、Cocoa等UI系統(tǒng)不約而同地選擇了標(biāo)記語言來描述界面蹬音。
在這樣的架構(gòu)中,view(或者說叫控件休玩,不但是從依賴關(guān)系上跟程序的其他部件解耦著淆,而且從語言上跟其它部分隔離開來)
然而這樣的系統(tǒng)架構(gòu)中劫狠,MVC和MVP模式已經(jīng)不能很好地適用了。微軟架構(gòu)師John Gossman在WPF的XAML模式推出的同時永部,提出了MVVM的概念独泞。
![MVP](https://raw.githubusercontent.com/liucloo/HelloDatabinding/master/img/mvvm/mvc2mvvm.jpg)
在安卓開發(fā)中,layout文件是靜態(tài)的苔埋,只能通過代碼進(jìn)行修改懦砂,大量的事件綁定和finViewById以及視圖的邏輯充斥在Activity中,使Acticity顯得特別胖组橄。
MVP雖然在一定程度上解決了Acticity代碼量龐大荞膘,實(shí)現(xiàn)視圖邏輯和視圖操作的解耦,但是他們還是需要大量的代碼對layout進(jìn)行設(shè)置屬性玉工,比如說ImageView的setImageBitmap或者TextView的setText衫画,顯得特別啰嗦也很容易出錯
但是而在安卓的Databinding中,把一個layout里面的控件的某些屬性綁定對應(yīng)的bean瓮栗,把操作的控件看成bean對象削罩,只需要對layout綁定的bean進(jìn)行修改之后,layout就會隨之改變费奸。
這里的bean就是MVVM中的Model弥激,那么對bean進(jìn)行邏輯處理的就是VM(ViewModel),這樣我們主需要關(guān)心M和VM之間的交互了愿阐。但是微服,還不能是實(shí)現(xiàn)雙向綁定,比如說缨历,對一個EditText的text屬性綁定一個bean的屬性,那么對EditText修改之后他的bean不會隨之變化以蕴,當(dāng)然可以自定義屬性解決這個問題。
下面就是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是系統(tǒng)自動生成的
然后看一下MVVM的示意圖
![MVVM](https://raw.githubusercontent.com/liucloo/HelloDatabinding/master/img/mvvm/mvvm.png)
MVVM是MVP的升級版,只是把
presenter
變成了ViewModel
冶匹,并且MVVM支持綁定习劫。