來談一下android中的MVVM

2021-02-19 終端研發部

【公眾號回復「1024」,送你一個特別推送】

前言

MVC是Model-View-Controller的縮寫,它將應用程式劃分為三個部分:

MVC優點

實現關注點分離,即應用程式中的數據模型與業務和展示邏輯解耦。在客戶端開發中,就是將模型(M-數據、操作數據)、視圖(V-顯示數據的HTML元素)之間實現代碼分離,鬆散耦合,使之成為一個更容易開發、維護和測試的客戶端應用程式。

MVC缺點:

不適合小型,中等規模的應用程式,花費大量時間將MVC應用到規模並不是很大的應用程式通常會得不償失。

視圖與控制器間過於緊密連接,視圖與控制器是相互分離,但卻是聯繫緊密的部件,視圖沒有控制器的存在,其應用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。

視圖對模型數據的低效率訪問,依據模型操作接口的不同,視圖可能需要多次調用才能獲得足夠的顯示數據。對未變化數據的不必要的頻繁訪問,也將損害操作性能

MVP

MVP(Model-View-Presenter)是MVC的改良模式,由IBM的子公司Taligent提出。和MVC的相同之處在於:Controller/Presenter負責業務邏輯,Model管理數據,View負責顯示只不過是將 Controller 改名為 Presenter,同時改變了通信方向。

MVP特點:

M、V、P之間雙向通信。

View 與 Model 不通信,都通過 Presenter 傳遞。Presenter完全把Model和View進行了分離,主要的程序邏輯在Presenter裡實現。

View 非常薄,不部署任何業務邏輯,稱為」被動視圖」(Passive View),即沒有任何主動性,而 Presenter非常厚,所有邏輯都部署在那裡。

Presenter與具體的View是沒有直接關聯的,而是通過定義好的接口進行交互,從而使得在變更View時候可以保持Presenter的不變,這樣就可以重用。不僅如此,還可以編寫測試用的View,模擬用戶的各種操作,從而實現對Presenter的測試–從而不需要使用自動化的測試工具。

MVP優點:

模型與視圖完全分離,我們可以修改視圖而不影響模型;

可以更高效地使用模型,因為所有的交互都發生在一個地方——Presenter內部;

我們可以將一個Presenter用於多個視圖,而不需要改變Presenter的邏輯。這個特性非常的有用,因為視圖的變化總是比模型的變化頻繁;

如果我們把邏輯放在Presenter中,那麼我們就可以脫離用戶接口來測試這些邏輯(單元測試)。

MVP缺點:

視圖和Presenter的交互會過於頻繁,使得他們的聯繫過於緊密。也就是說,一旦視圖變更了,presenter也要變更。

MVVM

MVVMModel-View-ViewModel的簡寫。主要目的是分離視圖(View)和模型(Model)

MVVM優點

低耦合,視圖(View)可以獨立於Model變化和修改,一個ViewModel可以綁定到不同的」View」上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。

可重用性,可以把一些視圖邏輯放在一個ViewModel裡面,讓很多view重用這段視圖邏輯。

獨立開發,開發人員可以專注於業務邏輯和數據的開發(ViewModel),設計人員可以專注於頁面設計,使用Expression Blend可以很容易設計界面並生成xml代碼。

可測試,界面向來是比較難於測試的,而現在測試可以針對ViewModel來寫。

DataBinding是Google在2015年7月發布的Android Studio v1.3.0 版本上引入的,在2016年4月Android Studio v2.0.0 上正式支持。引入之初,不支持雙向綁定,目前已經支持了。

DataBinding 是基於MVVM思想實現數據和UI綁定的的框架,有了 Data Binding,在Android中也可以很方便的實現MVVM。

在引入DataBinding之前,我們需要敲很多很雞肋的代碼,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通過 Data Binding , 我們可以通過聲明式布局以精簡的代碼來綁定應用程式邏輯和布局,這樣就不用編寫大量的毫無營養的代碼了。

DataBinding使用1、在使用的module的build.gradle中加入

android {
      dataBinding {
       enabled true
   }
}

2、數據類

可用ObservableField,也可以用LiveData,官方推薦LiveData,LiveData會遵從其他應用組件(如activity,fragment)的生命周期,它只會在UI組件處在active狀態(如activity處在started和resumed )時才會推送數據。這樣避免了我們UI展示數據時,需要檢查下組件是否存在。具體後續說明。這裡demo用的ObservableField.。

public class UserBean {

public ObservableFieldname =new ObservableField<>();

   public ObservableFieldage =new ObservableField<>();

   public ObservableFieldsex =new ObservableField<>();

}

3、布局文件

布局文件根標籤是layout。layout中包含data標籤,以及view。data部分是對應使用model。import說明是哪個具體的數據類,可定義alias 別名。variable定義變量,給view中引用,type為變量的類型。

4、在activity中使用

MainMvvmBinding 這個是根據布局文件自動生成的,布局文件命名為main_mvvm,則生成MainMvvmBinding,如果命名為activity_main,則生成ActivityMainBinding。

public class MainActivityextends AppCompatActivity {

private MainMvvmBinding binding;

   @Override

   protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

       binding = DataBindingUtil.setContentView(this, R.layout.main_mvvm);

       UserBean userBean =new UserBean();

       userBean.name.set("張三");

       userBean.age.set(28);

       userBean.sex.set("男");

       binding.setUser(userBean);

   }

}

項目demo代碼可見:
https://github.com/feb07/MVVMProject

總結

通過dataBinding 實現mvvm模式,使得數據和UI綁定,代碼更加簡潔,大大的減少了代碼量。通過 Data Binding , 我們可以通過聲明式布局以精簡的代碼來綁定應用程式邏輯和布局。期待在項目中的使用~~

作者:憤怒的五百萬
https://www.jianshu.com/p/1f5a819682c7

閱讀更多

相信自己,沒有做不到的,只有想不到的

在這裡獲得的不僅僅是技術!

相關焦點

  • 三年經驗 Android 開發面經總結
    ARouter詳細原理10.講一下事件分發機制,RecyclerView是怎麼處理內部ViewClick衝突的11.mainfest中配置LargeHeap,真的能分配到大內存嗎?是怎麼實現的7.泛型是怎麼解析的,比如在retrofit中的泛型是怎麼解析的8.mvp與mvvm的區別,mvvm怎麼更新UI,databinding用得多嗎,databinding的原理?9.kotlin ?
  • 三年啦,跳槽成功的Android開發面經總結!
    是怎麼實現的7.泛型是怎麼解析的,比如在retrofit中的泛型是怎麼解析的8.mvp與mvvm的區別,mvvm怎麼更新UI,databinding用得多嗎,databinding的原理?9.kotlin ?
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    也就是View跟Model,必須通過Controller來承上啟下。MVC和MVVM的區別並不是VM完全取代了C,ViewModel存在目的在於抽離Controller中展示的業務邏輯,而不是替代Controller,其它視圖操作業務等還是應該放在Controller中實現。也就是說MVVM實現的是業務邏輯組件的重用。
  • 介紹一下 Android Handler 中的 epoll 機制?
    介紹一下 Android Handler 中的 epoll 機制?目錄:IO 多路復用IO 多路復用是一種同步 IO 模型,實現一個線程可以監視多個文件句柄。中:static jlong android_os_MessageQueue_nativeInit(JNIEnv* env, jclass clazz) {    NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue();    ...
  • Android開發必備的「80」個開源庫
    Android Developerhttps://developer.android.google.cn/Android Training 中文版http://hukai.me/android-training-course-in-chinese/index.htmlMaterial Design 中文版http
  • Android中的窗口——Activity
    下面來看一下主界面的布局文件。 遷移Android工程可能發生的錯誤除了要自己編寫程序外,還需要閱讀大量別人寫的程序,或是將其他機器上自己編寫的原始碼遷移到另一臺機上。完成這些工作的第一步就是將工程導入到Eclipse中。
  • 了解一下,Android 10中的ART虛擬機(2)
    緣起接著上期」了解一下,Android 10中的ART虛擬機(I)「,今天繼續介紹ART。
  • Android 4.0新增Space及GridLayout初談
    本文將帶大家一探android 4.0新增的space及gridlayout布局的相關特性。  概述  在Android中,使用的最多的布局是LinearLayout了,它可以讓布局界面中的子控制項以常見的方式比如水平或者垂直方向對齊。
  • Android組件化架構 - 5. 數據存儲 & GreenDao,Room
    ,其插入和查詢速度優於greendao, 刪除速度greendao更快; greendao的包體積遠小於realm, 操作更簡單 ,因為greendao底層使用Android原生的SQLite3, 而realm使用本身的數據查詢引擎, 需要引入額外的so庫, realm支持JSON和流式api也支持rxjava;有興趣的話可以研究一下,其GitHub地址如下:https://github.com
  • Android 11來了,快!扶我起來
    「這就來這就來,哎!如果你有Pixel,那麼恭喜你可以直接通過刷OTA的方式來體驗和提前適配安卓11。「「什麼?不知道怎麼配置?真的是,給你說下吧,記好了。」在 Android Studio 中,依次點擊 Tools > SDK Manager。
  • Android 中的 MVP 模式(帶實例)
    後面也有很多github源碼,都是特別經典的例子,可以學習一下。(1).在 Android中很重要的一點就是對UI的操作基本上需要異步進行也就是在MainThread中才能操作UI,所以對View與Model的切斷分離是 合理的。此外Presenter與View、Model的交互使用接口定義交互操作可以進一步達到鬆耦合也可以通過接口更加方便地進行單元測試。
  • android 中常用的五種布局 - CSDN
    相對布局特有的屬性:值是某個控制項和布局的idandroid:layout_below 在某控制項的下方android:layout_above 在某控制項的的上方android:layout_toLeftOf 在某控制項的左邊android:layout_toRightOf 在某控制項的右邊android:layout_alignTop 本控制項的上邊緣和某控制項的的上邊緣對齊
  • pandyle 1.1.0 發布,非常簡單的前端 MVVM 庫
    特點簡單:非常簡單易上手,無需學習webpack、es6等前端知識,基本看一遍文檔即可進行開發兼容性良好:pandyle的兼容性取決於jquery版本,因此使用1.X版本的jquery即可兼容至ie8瀏覽器約定優先的組件:pandyle採用約定優先的原則來設計組件,默認情況下只需在components
  • Android中AIDL的基本用法
    因此Android提供了AIDL來幫助你完成這些工作。從AIDL的功能來看,它主要的應用場景就是IPC。雖然同一個進程中的client-service也能夠通過AIDL定義接口來進行通信,但這並沒有發揮AIDL的主要功能。 概括來說:    如果不需要IPC,那就直接實現通過繼承Binder類來實現客戶端和服務端之間的通信。
  • Android學習(四) — 組件(一)
    通俗講就是我們在Android的App中看到的輸入框,文字(文本框),按鈕,菜單等,這些都是組件,本期我們來了解一部分組件,學習怎麼使用吧~ 」首先我們在Android Studio中新建一個項目,然後就可以開始今天的學習了(●ˇ∀ˇ●)
  • 深入講解Android中Activity launchMode
    但是Activity絕非啟動展示在屏幕而已,其啟動方式也大有學問,本文講具體介紹Activity的啟動模式的諸多細節,糾正一些開發中可能錯誤的觀點,幫助大家深入理解Activity。在正式行文之前,先介紹一些文章提到的概念本文圖片較多,在看圖時,請注意觀察Activity頂部的title,來區分具體Activity。
  • MVC,MVP 和 MVVM 圖示
    > 來自:阮一峰的網絡日誌連結:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html
  • 架構 MVC,MVP 和 MVVM 圖示
    來自:阮一峰的網絡日誌連結:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html
  • 玩Android 快應用已經開源啦~
    其實我個人不太喜歡談看法,偶爾會寫一些看法類文章都是有感而發並結合自己真實的經歷,如果觸動不了我自己,那應該只能算迷魂湯...對於新技術的出現,我的個人主張是親身做一下體驗,所以快應用剛出來的時候,也是非常快速的寫了個Demo,然後評估下,然後寫篇入門文章希望通過從技術層面給大家一個簡單的普及。