zoukankan      html  css  js  c++  java
  • Android之练习MVVM+DataBinding框架模式

    最近简单学习了MVVM框架,记录一下。

    结果演示: 

     

    分析其功能在不同框架下的构成:

    • 无框架

    可以明显感受到在无框架下,虽然一个单独的Activity即可实现功能,但其负担过重,代码复查时繁琐,一旦需要修改,复杂项目极难维护。

    • MVC

    在MVC框架下,虽然将获取数据与界面展示分割开来,但对于Controller层,仍然拥有很多权利,随着功能的增多,其代码量也将会大大增长,不利于维护修改。

    • MVP

     

    在使用MVP框架时,View层与Model层不通信,都通过 Presenter层传递,并且Presenter层与具体的View是没有直接关联的,而是通过定义好的接口进行交互,这就可能会导致有大量的接口生成,代码复杂繁琐,难维护。

    因此,在使用MVP时最好按照一定规范去做:

    1. 接口规范化(封装父类接口以减少接口的使用量)
    2. 使用第三方插件自动生成MVP代码
    3. 对于一些简单的界面,可以选择不使用框架
    4. 根据项目复杂程度,部分模块可以选择不使用接口
    • 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

  • 相关阅读:
    NodeJs使用Mysql模块实现事务处理
    Javascript(JS)对Cookie的读取、删除、写入操作帮助方法
    SLERP 导数
    General matrix representations for B-splines 论文理解
    搭建私人实体编译服务器
    A Micro Lie Theory 论文理解
    [备忘,无新意] undistort (求反函数对某个值的映射)使用迭代优化方法
    Dual Quaternion representing Rigid Transformation
    B 样条曲线的 SE(3) 应用
    [ceres-solver] From QuaternionParameterization to LocalParameterization
  • 原文地址:https://www.cnblogs.com/jiani/p/12609272.html
Copyright © 2011-2022 走看看