Android之练习MVVM+DataBinding框架模式
最近简单学习了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
下一篇: JavaScript中数组的常用方法
推荐阅读
-
Android框架之MVP模式(以登录为例)
-
Java 集合框架之List 的使用(附小游戏练习)
-
Android Activity启动模式之singleTop实例详解
-
Android Activity启动模式之standard实例详解
-
Android Activity启动模式之singleTask实例详解
-
Android入门之Activity四种启动模式(standard、singleTop、singleTask、singleInstance)
-
Android设计模式之单例模式解析
-
Android设计模式之Builder模式解析
-
Android入门之Activity四种启动模式(standard、singleTop、singleTask、singleInstance)
-
Android开发之文件操作模式深入理解