最近簡單學習了MVVM框架,記錄一下。 結果演示: 分析其功能在不同框架下的構成: 無框架 可以明顯感受到在無框架下,雖然一個單獨的Activity即可實現功能,但其負擔過重,代碼複查時繁瑣,一旦需要修改,複雜項目極難維護。 MVC 在MVC框架下,雖然將獲取數據與界面展示分割開來,但對於Contr ...
最近簡單學習了MVVM框架,記錄一下。
結果演示:
分析其功能在不同框架下的構成:
- 無框架
可以明顯感受到在無框架下,雖然一個單獨的Activity即可實現功能,但其負擔過重,代碼複查時繁瑣,一旦需要修改,複雜項目極難維護。
- MVC
在MVC框架下,雖然將獲取數據與界面展示分割開來,但對於Controller層,仍然擁有很多權利,隨著功能的增多,其代碼量也將會大大增長,不利於維護修改。
- MVP
在使用MVP框架時,View層與Model層不通信,都通過 Presenter層傳遞,並且Presenter層與具體的View是沒有直接關聯的,而是通過定義好的介面進行交互,這就可能會導致有大量的介面生成,代碼複雜繁瑣,難維護。
因此,在使用MVP時最好按照一定規範去做:
- 介面規範化(封裝父類介面以減少介面的使用量)
- 使用第三方插件自動生成MVP代碼
- 對於一些簡單的界面,可以選擇不使用框架
- 根據項目複雜程度,部分模塊可以選擇不使用介面
- MVVM
MVVM框架實現了數據與視圖的綁定(DataBinding),當數據變化時,視圖會自動更新;反之,當視圖變化時,數據會自動更新。
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); //初始化viewModel 12 } 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中使用application 18 // 比如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 @Override 30 public void onSuccess(Account account) { 31 String info = account.getName() + "|" + account.getLevel(); 32 setResult(info); 33 } 34 35 @Override 36 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 <LinearLayout 14 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 <EditText 20 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 <Button 27 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 <TextView 36 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