Android之練習MVVM+DataBinding框架模式

最近簡單學習了MVVM框架,記錄一下。html

結果演示: android

 

 

分析其功能在不一樣框架下的構成:網絡

  • 無框架

 

 

能夠明顯感覺到在無框架下,雖然一個單獨的Activity便可實現功能,但其負擔太重,代碼複查時繁瑣,一旦須要修改,複雜項目極難維護。app

  • MVC

在MVC框架下,雖然將獲取數據與界面展現分割開來,但對於Controller層,仍然擁有不少權利,隨着功能的增多,其代碼量也將會大大增加,不利於維護修改。框架

  • MVP

 

 

 

 

在使用MVP框架時,View層與Model層不通訊,都經過 Presenter層傳遞,而且Presenter層與具體的View是沒有直接關聯的,而是經過定義好的接口進行交互,這就可能會致使有大量的接口生成,代碼複雜繁瑣,難維護。dom

所以,在使用MVP時最好按照必定規範去作:mvvm

  1. 接口規範化(封裝父類接口以減小接口的使用量)
  2. 使用第三方插件自動生成MVP代碼
  3. 對於一些簡單的界面,能夠選擇不使用框架
  4. 根據項目複雜程度,部分模塊能夠選擇不使用接口
  • MVVM

 MVVM框架實現了數據與視圖的綁定(DataBinding),當數據變化時,視圖會自動更新;反之,當視圖變化時,數據會自動更新。ide

 

 

DataBinding使用步驟:佈局

  • 啓用DataBinding
  • 修改佈局文件爲DataBinding佈局
  • 數據綁定

使用MVVM框架步驟:學習

  • 提供View、ViewModel以及Model三層
  • 將佈局修改成DataBinding佈局
  • View與ViewMedel之間經過DataBinding進行通訊
  • 獲取數據並展現在界面上

再更深層次學習,可使用LiveData+ViewModel

如下是採用MVVM框架的代碼:


 

Account

 1 public class Account { 2     String name; 3     int level; 4  5     public String getName() { 6         return name; 7     } 8  9     public void setName(String name) {10         this.name = name;11     }12 13     public int getLevel() {14         return level;15     }16 17     public void setLevel(int level) {18         this.level = level;19     }20 }

 

 

MCallBack

1 public interface MCallback {2     public void onSuccess(Account account);3     public  void onFailed();4 }

 

 

MVVMActivity

 1 public class MVVMActivity extends AppCompatActivity { 2     private ActivityMvvmBinding binding; 3     private MVVMViewModel mvvmViewModel; 4  5     @Override 6     protected void onCreate(Bundle savedInstanceState) { 7         super.onCreate(savedInstanceState); 8         binding = DataBindingUtil.setContentView(this,R.layout.activity_mvvm); 9 10         mvvmViewModel = new MVVMViewModel(getApplication(),binding);11         binding.setViewModel(mvvmViewModel);  //初始化viewModel12     }13 }

 

MVVMModel

 1 public class MVVMModel { 2  3     //模擬查詢帳號數據 4     public void getAccountData(String accountName, MCallback callback){ 5         Random random = new Random(); 6         boolean isSuccess = random.nextBoolean(); 7         if(isSuccess){ 8             Account account = new Account(); 9             account.setName(accountName);10             account.setLevel(100);11             callback.onSuccess(account);12         }else {13             callback.onFailed();14         }15     }16 }

 

MVVMViewModel

 1 public class MVVMViewModel extends BaseObservable { 2  3     private ActivityMvvmBinding binding; 4     private MVVMModel mvvmModel; 5     private String Input; 6     private String result; 7  8     @Bindable 9     public String getResult() {10         return result;11     }12 13     public void setResult(String result) {14         this.result = result;15         notifyPropertyChanged(com.example.mvvmdemo2.BR.result);16     }17     //    通常須要傳入Application對象,方便在ViewModel中使用application18     //    好比sharedpreferences須要使用19     public MVVMViewModel(Application application, ActivityMvvmBinding binding) {20         this.binding=binding;21         mvvmModel = new MVVMModel();22 23     }24 25     public void getData(View view){26 27         Input = binding.etAccount.getText().toString();28         mvvmModel.getAccountData(Input, new MCallback() {29             @Override30             public void onSuccess(Account account) {31                 String info = account.getName() + "|" + account.getLevel();32                 setResult(info);33             }34 35             @Override36             public void onFailed() {37                 setResult("消息獲取失敗");38             }39         });40     }41 }

 

xml

 1 <?xml version="1.0" encoding="utf-8"?> 2 <layout xmlns:android="http://schemas.android.com/apk/res/android" 3     xmlns:app="http://schemas.android.com/apk/res-auto" 4     xmlns:tools="http://schemas.android.com/tools"> 5  6     <data> 7         <variable 8             name="viewModel" 9             type="com.example.mvvmdemo2.mvvm.MVVMViewModel" />10 11     data>12 13     <LinearLayout14         android:layout_width="match_parent"15         android:layout_height="match_parent"16         tools:context=".mvvm.MVVMActivity"17         android:orientation="vertical"18         android:gravity="center">19         <EditText20             android:id="@+id/et_Account"21             android:layout_width="match_parent"22             android:layout_height="wrap_content"23             android:hint="請輸入帳戶名稱"24             android:layout_marginBottom="50dp"25             />26         <Button27             android:id="@+id/btn_getAccount"28             android:layout_width="wrap_content"29             android:layout_height="wrap_content"30             android:text="查詢帳戶信息"31             android:layout_marginBottom="50dp"32             android:onClick="@{viewModel.getData}"33             />34 35         <TextView36             android:id="@+id/tv_getResult"37             android:layout_width="wrap_content"38             android:layout_height="wrap_content"39             android:hint="暫未獲取帳戶信息"40             android:text="@{viewModel.result}"/>41 42     LinearLayout>43 layout>

 

網絡能夠給咱們提供不少資料,我的認爲,看再多的視頻與文章不如實際去跟着敲一敲代碼,這樣更便於加深理解。

很是感謝oohuo老師的視頻講解,能夠說是對初學者很是友好了,想要學習的同窗能夠去搜索學習:Android中的MVC_MVP_MVVM

想要更多瞭解MVC、MVP、MVVM之間的區別能夠看我以前的博客:Android之MVC、MVP、MVVM

相關文章
相關標籤/搜索