MVVM模式介紹以及和MVP對比

MVP

網(wǎng)絡應用中的MVP模式

MVP模式的目的是將業(yè)務處理部分從Activity所在的View層中獨立出來作為Model螺垢,通過Presenter關(guān)聯(lián)View和Model辉川。View和Model的交互需要通過Presenter傳遞洽糟。

MVVM

MVVM乍看之下和MVP差不多莹痢,他們之間最大的區(qū)別是MVP會持有抽象的View坪郭,而MVVM使用了雙向綁定(data-binding),只是充當了View和Model之間的媒婆侣监,一旦牽線成功就沒媒婆什么事了,Model的變動臣淤,自動反映在 View上橄霉,反之亦然。

databinding數(shù)據(jù)綁定的使用

MVVM框架通過解析布局xml邑蒋,自動生成ViewDataBinding的子類姓蜂,我們不需要再手動去獲取xml中的UI元素。這些類中的UI元素已經(jīng)指定了綁定的數(shù)據(jù)類型医吊,接下來就可以在ViewModel中指定數(shù)據(jù)源钱慢,實現(xiàn)UI隨著數(shù)據(jù)源變化而變化。

build.gradle中添加:

android {
    ....
    dataBinding {
        enabled = true
    }
}

布局文件中綁定數(shù)據(jù)源和UI:

<?xml version="1.0" encoding="utf-8"?>
//最外層是layout 
<layout xmlns:android="http://schemas.android.com/apk/res/android">
  //數(shù)據(jù)源聲名
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/> //UI綁定數(shù)據(jù)源
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/> //UI綁定數(shù)據(jù)源
   </LinearLayout>
</layout>

定義數(shù)據(jù)源實體:

//可以不寫get / set
public class User {
   public final String firstName;
   public final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
}

DataBinding可以通過AndroidX的DataBindingUtil自動將layout生成一個binding class卿堂。如果布局文件是main_activity.xml束莫,就會生成一個MainActivityBinding的class:

   MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);

我們可以通過這個binding class管理數(shù)據(jù)源,數(shù)據(jù)源又會自動影響UI草描。
其實數(shù)據(jù)源可以使用基本數(shù)據(jù)類型览绿,我們可以同樣可以通過binding class來管理它:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="isLoading"
            type="boolean" />
    </data>
    ...
</layout>
//生成binding class
private ListFragmentBinding mBinding;
mBinding = DataBindingUtil.inflate(inflater, R.layout.list_fragment, container, false);
//設置數(shù)據(jù)源的值
mBinding.setIsLoading(false);

databinding還支持事件綁定和自定義綁定,這里就不展開了穗慕。

ViewModel

ViewModel類是用來保存UI數(shù)據(jù)的類饿敲,它會在配置變更(即 Configuration Change,例如手機屏幕的旋轉(zhuǎn))之后繼續(xù)存在逛绵。
我們獲取ViewMode的代碼如下:

XXX instance = ViewModelProviders.of(this).get(XXX.class);

MVVM相較于MVP的優(yōu)缺點:

1怀各,MVVM和MVP都可以實現(xiàn)UI和業(yè)務邏輯處理的解耦倔韭,但MVP需要定義大量UI和Model的接口供Presenter調(diào)用,修改起來比較麻煩瓢对;MVVM在面對修改時寿酌,一般情況下ViewModel不需要做太多的改動。
2沥曹,MVVM中份名,UI和數(shù)據(jù)的交互是自動的,并不需要Presenter轉(zhuǎn)發(fā)
3妓美,MVVM有大量的功能是通過xml自動生成的代碼實現(xiàn)的僵腺,出現(xiàn)問題時不利于調(diào)試
4,使用dataBinding會導致大量的內(nèi)存消耗:
(1)會產(chǎn)生多余的數(shù)組壶栋,存放view對象
(2)針對每一個控件都會產(chǎn)生一個回調(diào)對象

google官方demo BasicSample介紹

https://github.com/android/architecture-components-samples

BasicSample_architecture-components-samples.jpg

粉色:View | 淺藍:ViewModel | 紫色:Model | 淡黃:通過xml自動生成的類

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辰如,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贵试,更是在濱河造成了極大的恐慌琉兜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毙玻,死亡現(xiàn)場離奇詭異豌蟋,居然都是意外死亡,警方通過查閱死者的電腦和手機桑滩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門梧疲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人运准,你說我怎么就攤上這事幌氮。” “怎么了胁澳?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵该互,是天一觀的道長。 經(jīng)常有香客問我韭畸,道長宇智,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任胰丁,我火速辦了婚禮普筹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隘马。我一直安慰自己太防,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜒车,像睡著了一般讳嘱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酿愧,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天沥潭,我揣著相機與錄音,去河邊找鬼嬉挡。 笑死钝鸽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的庞钢。 我是一名探鬼主播拔恰,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼基括!你這毒婦竟也來了颜懊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤风皿,失蹤者是張志新(化名)和其女友劉穎河爹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桐款,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡咸这,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了魔眨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳维。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冰沙,靈堂內(nèi)的尸體忽然破棺而出侨艾,到底是詐尸還是另有隱情执虹,我是刑警寧澤拓挥,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站袋励,受9級特大地震影響侥啤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茬故,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一盖灸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磺芭,春花似錦赁炎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讥裤。三九已至,卻和暖如春姻报,著一層夾襖步出監(jiān)牢的瞬間己英,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工吴旋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留损肛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓荣瑟,卻偏偏與公主長得像治拿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子褂傀,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354