Android之MVVM開發模式

MVVM 模式簡介java

MVVM模式是指Model-View-ViewModel。相信看過筆者關於MVP的文章的讀者也會發現,不管如何抽象化,在咱們的View層中是沒法避免的要處理一部分邏輯的。而MVVM模式中的View是將View的狀態和行爲徹底抽象化,把邏輯與界面的控制徹底交給ViewModel處理。
MVVM由下面三個核心組件組成:android

    • Model: 用於獲取業務數據模型
    • View: 定義了界面中的佈局和外觀
    • ViewModel: 邏輯控制層,負責處理數據和處理View層中的業務邏輯

什麼是DataBinding

DataBinding是Google官方推出的數據綁定器,這個綁定器的做用是把數據和View綁定起來,而後數據改變的時候View會自動刷新,這個DataBinding就是咱們實現MVVM模式的關鍵。數據庫


引入DataBinding

引入DataBinding的方式很簡單,咱們只須要在Module的build.gradle添加以下代碼便可。設計模式

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

使用DataBinding

使用DataBinding的佈局文件和普通的佈局文件有點不一樣,DataBinding佈局文件的根標籤是layout標籤,layout裏面有一個data元素和View元素,這個View元素就是咱們沒使用DataBinding時候的佈局文件。下面看看例子代碼:網絡

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.loaderman.modedemo.MainActivity">

    <data>

        <variable
            name="user"
            type="com.loaderman.modedemo.User" />

        <variable
            name="myHandlers"
            type="com.loaderman.modedemo.myHandlers" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:onClick="@{myHandlers.onClickName}"
            android:text="@{user.name}"

            />
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:text="更新數據"
            android:layout_height="wrap_content" />

    </LinearLayout>

</layout>

 


Android MVVM 模式

MVVM在不一樣的平臺實現方式是有必定差別性的。在Google IO 2017 ,Google發佈了一個官方應用架構庫Architecture Components,這個架構庫即是Google對Android應用架構的建議,也被稱之爲Android官方應用架構指南。Android Architecture Components在Google中國開發者網站中能找到。和Data Binding Library同樣官方還沒翻譯爲中文。

下圖是Architecture的應用架構圖。結合Android程序特色,總體上與微軟的MVVM相似,可是作了更細緻的模塊劃分。架構


View
顯而易見 Activity/Fragment 即是MVVM中的View,當收到ViewModel傳遞來的數據時,Activity/Fragment負責將數據以你喜歡的方式顯示出來。實際是View成還包括ViewDataBinding(根據xml自動生成),上面中並無體現。
ViewModel
ViewModel做爲Activity/Fragment與其餘組件的鏈接器。負責轉換和聚合Model中返回的數據,使這些數據易於顯示,並把這些數據改變及時的通知給Activity/Fragment。
ViewModel是具備生命週期意識的,當Activity/Fragment銷燬時ViewModel的onClear方法會被回調,你能夠在這裏作一些清理工做。
LiveData是具備生命週期意識的一個可觀察的的數據持有者,ViewModel中的數據由LiveData持有,而且只有當Activity/Fragment處於活動時纔會通知UI數據的改變,避免無用的刷新UI;
Model
Repository及其下方就是Model了。Repository負責提取和處理數據。數據能夠來自本地數據庫(Room),也能夠來自網絡,這些數據統一有Repository處理,對應隱藏數據來源及獲取方式
Binder 綁定器
上圖中並無標出綁定器在哪裏,其實在任何MVVM的實現中,數據綁定技術都是必須的。而上圖僅僅是應用架構圖。
Android中的數據綁定技術由 DataBinding和LiveData共同實現。當Activity/Fragment接收到來自ViewModel中的新數據時(由LiveData自動通知數據的改變),將這些數據經過DataBinding綁定到ViewDataBinding中,UI將會自動刷新,而不用書寫相似setText的方法。app


數據對象mvvm

package com.loaderman.modedemo;

public class User {
    public  String name;

}

事件綁定對象ide

package com.loaderman.modedemo;

import android.view.View;
import android.widget.TextView;
import android.widget.Toast;



public class myHandlers  {
    public void onClickName(View view){
        TextView view1 = (TextView) view;
        Toast.makeText(view.getContext(),view1.getText().toString(),Toast.LENGTH_SHORT).show();
    }
}

MainActivty.java函數

package com.loaderman.modedemo;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.loaderman.modedemo.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    User user;
    private ActivityMainBinding dataBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        user = new User();
        dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //模擬數據更新
                user.name = "android ";
                dataBinding.setUser(user);
            }
        });
        user.name = "loaderman";
        //數據綁定
        dataBinding.setUser(user);
        //事件綁定
        dataBinding.setMyHandlers(new myHandlers());
    }

}

在listview 等列表的adapter中使用數據綁定,可使用以下方式

     LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        DataBindingUtil.inflate(inflater,R.layout.activity_main, viewgroup,false);

MVVM設計模式的優勢
1.雙向綁定技術,當Model變化時,View-Model會自動更新,View也會自動變化。很好作到數據的一致性,不用擔憂,在模塊的這一塊數據是這個值,在另外一塊就是另外一個值了。因此 MVVM模式有些時候又被稱做:model-view-binder模式。
2.View的功能進一步的強化,具備控制的部分功能,若想無限加強它的功能,甚至控制器的所有功幾乎均可以遷移到各個View上(不過這樣不可取,那樣View幹了不屬於它職責範圍的事情)。View能夠像控制器同樣具備本身的View-Model.
3.因爲控制器的功能大都移動到View上處理,大大的對控制器進行了瘦身。不用再爲看到龐大的控制器邏輯而發愁了。
4.能夠對View或ViewController的數據處理部分抽象出來一個函數處理model。這樣它們專職頁面佈局和頁面跳轉,它們必然更一步的簡化。


MVVM設計模式的缺點第一點:數據綁定使得 Bug 很難被調試。你看到界面異常了,有多是你 View 的代碼有 Bug,也多是 Model 的代碼有問題。數據綁定使得一個位置的 Bug 被快速傳遞到別的位置,要定位原始出問題的地方就變得不那麼容易了。第二點:一個大的模塊中,model也會很大,雖然使用方便了也很容易保證了數據的一致性,當時長期持有,不釋放內存,就形成了花費更多的內存。第三點:數據雙向綁定不利於代碼重用。客戶端開發最經常使用的重用是View,可是數據雙向綁定技術,讓你在一個View都綁定了一個model,不一樣模塊的model都不一樣。那就不能簡單重用View了。

相關文章
相關標籤/搜索