最近簡單學習了MVVM框架,記錄一下。html
結果演示: android
分析其功能在不一樣框架下的構成:網絡
能夠明顯感覺到在無框架下,雖然一個單獨的Activity便可實現功能,但其負擔太重,代碼複查時繁瑣,一旦須要修改,複雜項目極難維護。app
在MVC框架下,雖然將獲取數據與界面展現分割開來,但對於Controller層,仍然擁有不少權利,隨着功能的增多,其代碼量也將會大大增加,不利於維護修改。框架
在使用MVP框架時,View層與Model層不通訊,都經過 Presenter層傳遞,而且Presenter層與具體的View是沒有直接關聯的,而是經過定義好的接口進行交互,這就可能會致使有大量的接口生成,代碼複雜繁瑣,難維護。dom
所以,在使用MVP時最好按照必定規範去作:mvvm
MVVM框架實現了數據與視圖的綁定(DataBinding),當數據變化時,視圖會自動更新;反之,當視圖變化時,數據會自動更新。ide
DataBinding使用步驟:佈局
使用MVVM框架步驟:學習
再更深層次學習,可使用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