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