android MVVM開發模式(一)

來源:互聯網
上載者:User

標籤:


android MVVM開發模式
概念
mvvm 是一個在 mvp 架構上修改,目標是將view的一些更改,跟model關聯起來,使得model的資料改變,直接通知到view上面來,從而解決mvp架構裡面的v-p之間的介面太重問題。
所以mvvm的核心解決問題為:使得v-p直接的關係弱化,使用綁定方式(dataBinding)直接將model的改變反饋到view上面。
關於完整的dataBinding講解,請看這裡
https://github.com/LyndonChin/MasteringAndroidDataBinding
本講解決什麼問題呢?一個方面是簡單的使用dataBinding方式,一個是講解它內部如何做到的。
mvvm的含義:
mvvm指的是model view 和viewmodel。
model 就是資料實現和邏輯處理。
view 就是介面顯示。
viewmodel 建立的關聯,將model和view綁定起來。如此之後,我們model的更改,通過viewmodel反饋給view。(view的xml布局檔案,經過特定的編寫,編譯工具處理後,產生的程式碼會接收viewmodel的資料通知訊息,自動重新整理介面)

說多無益,直接看例子:
1在項目的build.gradle

2在模組的build.gradle
加入dataBinding
3建立一個User類

裡面有一個屬性name,我們等會要用。
4 編寫Activity_main.xml布局檔案

布局根節點換成layout
加入data節點
寫入一個變數,名字user,類型為com.xm.mvvmdemo.Model.User,也就是3這個類的位置。
在TextView的屬性android:text上寫入@{user.name}
這裡這個動作,在編譯後代碼會產生類似:textview.setText(user.getName());實際有些特殊,後面再說。
5在MainActivity裡面修改

替換setContentView(R.layout.activity_main)換成DataBindingUtil.setContentView(this, R.layout.activity_main),返回的是產生的綁定類ActivityMainBinding(這個就是我們的xml名字activity_main去掉串連,首字母大寫,拼接一個Binding組成的。)
這裡更換成這個DataBindingUtil.setContentView,內部做了哪些動作呢?在預設的setContentView動作後,做了一個綁定動作,將裡面的view和資料關聯起來。具體看怎麼關聯的,可以看ActivityMainBinding這個產生出來的類。

建立一個User,設定值。然後綁定。
通過binding.setUser(),將我們的資料傳回給view,通過我們自動產生的程式碼,可以直接將這個值賦值過去。

現在我們捋一捋這個思路。
改變xml,編譯之後,出來一個真正布局xml和一個binding代碼(這裡是ActivityMainBinding.java),這裡ActivityMainBinding裡面就是產生出來的將xml裡面的綁定地方的描述改為代碼:(這裡android:text:”@{user.name}”)產生為

第一個參數便是我們的TextView類,第二個值我們看到是從上面的User的執行個體出getName的值。
第一個參數如何來的:

改變setContentView單一動作,換為DataBindingUtil.setContentView。上面已經提過這個的思路。

現在我們寫好了綁定xml,替換了setContentView,這兩個動作完成後,我們的綁定類已經把裡面的view和需要的資料繫結起來了,這時我們是不是需要給賦值呢?

binding.setUser(user);將資料賦值過去,這樣子裡面則就將資訊反饋給介面了。

6總結
其實使用的時候,第一印象是我xml都能寫哪些東西啊,這個是我的第一個問題。
我們AS選擇到Project模式下,拉到最下方的地方,看到External Libraries ,可以看到一個adapters-1.1.jar,開啟就看到所有的可用屬性了。

我要自己定義屬性,系統的預設不夠用?
好吧,自己去寫標記為@BindingAdapter的一個靜態方法就可以了。隨意放,編譯器會自己找這個注釋的。

注意:綁定的編譯處理過程我們不管,我們把它當做黑盒子處理,看下它處理我們的布局xml的前後對比。

這裡我們看到在data節點標記了名字和類型,然後底下的去用這個名字裡面的屬性。我們發現,這裡我們只需要約定下這個關聯方法,這個就完全可以自動產生了。
因此,我們預設屬性的擷取都是通過get得到。這裡user.name就變成uset.getName() 關於這個android:text屬性呢,預設就是對應的set方法了,這裡沒有使用預設的,why?因為為了嚴謹,需要做賦值過濾。系統預設提供了具體方法:

我們看下這個布局和產生的布局之間的對比:

產生的時候直接將上面的layout和data拿掉了。將android:text也去掉了,這些去哪裡呢?(答案就是這個布局xml產生一個真正的布局檔案和一個管理綁定的代碼啦,這裡就是ActivityMainBinding)
ActivityMainBinding 主要完成幾件事情1:將裡面的需要綁定的view執行個體拿到。2:將view和model的關聯代碼產生出來。(也就是model該如何顯示到view上)
說了這麼多,再一次總結下databinding做了什麼:
依據約定的xml(layout作為根節點),產生真正的xml和一個綁定類綁定類為我們做了介面裡面的View和資料之間更新的規則。
然後我們用DataBindingUtil.setContentView 替換setContentView,因為它在setContentView的基礎上做了一個動作,就是把這個介面裡面的View和資料之間更新的規則直接交給我們的綁定類
如此一來,我們發現我們要寫的findviewbyid 和setText 被這個工具自動產生出來了,我們將這些動作寫入了布局裡面,讓工具幫我們做了代碼產生,從而讓我們解放了繁瑣重複的介面操作。
好吧,先這麼多,這個架構要寫的太多,敬請期待。

android MVVM開發模式(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.