最近简单学习了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