美文网首页
Android框架模式——MVVM

Android框架模式——MVVM

作者: 天平GG | 来源:发表于2019-02-21 22:04 被阅读70次

    1. MVVM介绍

    MVVM全名是Model-View-ViewModel,MVVM可以看作MVP的升级版。

    Model:模型层,负责处理数据的加载或存储。与MVP中的M一样。
    View:视图层,负责界面数据的展示,与用户进行交互。与MVP中的V一样。
    ViewModel:视图模型,负责完成View于Model间的交互,负责业务逻辑。

    1.1 作用

    • 降低View和控制模块的耦合,减轻了视图的压力。

    1.2 流程

    image

    1.View与ViewModel进行绑定,能够实现双向的交互。ViewModel数据改变时,View会相应变动UI,反之亦然。
    2.ViewModel进行业务逻辑处理,通知Model去更新。
    3.Model数据更新后,把新数据传递给ViewModel。

    2. MVVM例子实现

    还是以点击按钮对数字+1为例子,将其改造成MVVM模式。与MVP不同的地方是,ViewModel会跟View进行绑定。这里会用到Android的 Data Binding。关于Data Binding,可以看下这篇文章介绍:Data Binding Library

    2.1 Model层

    跟MVP的一样

    public class NumModel {
        private int num = 0;
    
        public void add(ModelCallback callback) {
            callback.onSuccess(++num);//通知Presenter结果
        }
    
        public interface ModelCallback {//数据回调接口
            void onSuccess(int num);
    
            void onFailed(String text);
        }
    
    }
    
    

    2.2 View层

    改写布局,增加Data Binding。

    vm_activity.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
        <data>
            <variable
                name="numVM"
                type="com.xx.oo.NumViewModel"/>
        </data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{numVM.num}"/>
    
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="@{numVM.onClickAdd}"
                android:text="点击+1"/>
        </LinearLayout>
    
    </layout>
    
    

    VmActivity类,将View与ViewModel进行绑定:

    public class VmActivity extends Activity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            NumViewModel numViewModel = new NumViewModel();
            VmActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.vm_activity);
            binding.setNumVM(numViewModel);//View与ViewModel绑定
        }
    }
    
    

    2.3 ViewModel

    ViewModel负责业务逻辑处理,并且数据有更新直接通知View去更改。

    public class NumViewModel extends BaseObservable {
        private String num;
    
        private final NumModel mNumModel;
    
        public NumViewModel() {
            mNumModel = new NumModel();
        }
    
        @Bindable
        public String getNum() {
            return num;
        }
    
        public void setNum(String num) {
            this.num = num;
            notifyPropertyChanged(BR.num);//更新UI
        }
    
        public void onClickAdd(View view) {//点击事件处理
            mNumModel.add(new NumModel.ModelCallback() {//相关逻辑处理,这里直接交给Model层
                @Override
                public void onSuccess(int num) {
                    setNum(num + "");//成功,更新数据
                }
    
                @Override
                public void onFailed(String text) {
                    setNum(text);//失败,更新数据
                }
            });
        }
    }
    
    

    3. MVP与MVVM区别

    • ViewModel与View绑定后,ViewModel与View其中一方的数据更新都能立即通知到对方;Presenter需要通过接口去通知View进行更新。

    4. MVVM的优点

    • 相比于MVP,Presente与View存在耦合。ViewModel与View的耦合则更低,ViewModel只负责处理和提供数据,UI的改变,比如TextView 替换 EditText,ViewModel 几乎不需要更改任何代码,只需专注于数据处理就可以了。
    • View Model里面只包含数据和业务逻辑,没有UI的东西,方便单元测试。

    5. MVVM的缺点

    • 数据绑定使得程序较难调试,界面出现异常时,有可能是 View 的代码有问题,也可能是 Model 的代码有问题。由于数据绑定使得数据能够快速传递到其他为止,因此要定位出异常就比较有难度了。

    6.其他

    • 如果要弹Dialog等等操作,可以在Activity中监听ViewModel的数据变化来做处理。
    • 鉴于能力和时间有限,没有很深入去了解各个方方面面,有问题的话可以一起讨论~

    相关文章阅读
    Android框架模式——MVC
    Android框架模式——MVP
    Android框架模式——MVVM

    相关文章

      网友评论

          本文标题:Android框架模式——MVVM

          本文链接:https://www.haomeiwen.com/subject/mhrjyqtx.html