美文网首页
Android MVVM

Android MVVM

作者: Android刘东 | 来源:发表于2020-05-11 09:37 被阅读0次

    1.MVC优缺点

    Android中的MVC
    模型层(M):针对业务模型,建立的数据结构以及相关的类,例如对数据库的操作,对网络数据的操作以及业务中的计算等操作应该放在该层。
    视图层(V):Android中的xml文件可以理解为视图层。
    控制层(C):Android中的逻辑处理在Activity中体现。
    MVC的优点:
    1):分工明确,各司所职。
    2):一定程度上降低了代码间的耦合性。
    MVC的缺点:
    1):随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。
    2):视图和控制器间过于紧密的联系,妨碍了各自的重用。
    

    2.MVP优缺点

    MVP是模型(model)-视图(view)-协调者(presenter)的缩写。
    
    模型层(M):负责存储,检索以及操纵数据。
    视图层(V):负责绘制UI,与用户进行交互(在Android中体现为Activity)
    协调者(P):作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
    
    MVP的优点:
    1)复杂的逻辑处理放在presenter进行处理,减少了activity的臃肿。
    2)M层与V层完全分离,修改V层不会影响M层,降低了耦合性。
    3)可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。
    3)P层与V层的交互是通过接口来进行的,便于单元测试。
    
    MVP的缺点:
    由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁,视图需要改变,一般presenter也需要跟着改变。
    

    3.MVVM优缺点

    MVVM是MVP的升级版本,VM是ViewModel的缩写,VM可以理解为View的数据模型和Presenter的合体,ViewModel和View之间的交互通过data binding完成。
    
    ViewModel(VM):ViewModel就是包含View的一些数据属性和操作,关键点就是使用databinding,View的变化会直接影响ViewModel,ViewModel的变化或者内容也会直接体现在View上。
    
    优点:
    Data Binding可以实现双向的交互,使得视图和控制层之间的耦合程度进一步降低,分离更为彻底,同时减轻了Activity的压力。
    
    缺点:
    数据绑定使得 Bug 很难被调试。你看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。
    
    
    MVVM例子步骤 1) build.gradle添加
    android {//添加
      dataBinding {
            enabled true
        }
    }
    
    2)实体类
    package com.zhisheng.test.mvvm;
    
    public class User {
        private String userName;
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getUserName() {
            return userName;
        }
    }
    
    
    3)Model
    package com.zhisheng.test.mvvm;
    
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MVVMViewModel {
    //各种逻辑 各种处理方法
        public void onClickName(View view){
            TextView view1 = (TextView) view;
            Toast.makeText(view.getContext(),view1.getText().toString(),Toast.LENGTH_SHORT).show();
        }
    }
    
    
    4)xml
    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
        <data>
    
            <variable
                name="user"
                type="com.zhisheng.test.mvvm.User" />
    
            <variable
                name="myHandlers"
                type="com.zhisheng.test.mvvm.MVVMViewModel" />
        </data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:layout_height="match_parent">
    
            <TextView
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:onClick="@{myHandlers.onClickName}"
                android:text="@{user.userName}"
    
                />
            <Button
                android:id="@+id/btn"
                android:layout_width="match_parent"
                android:text="更新数据"
                android:layout_height="wrap_content" />
    
        </LinearLayout>
    
    </layout>
    
    5)Activity
    package com.zhisheng.test.mvvm;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    
    import androidx.annotation.Nullable;
    import androidx.databinding.DataBindingUtil;
    import com.zhisheng.test.R;
    import com.zhisheng.test.databinding.ActivityMvvmBinding;
    
    public class MVVMActivity extends Activity {
        ActivityMvvmBinding mViewDataBinding;//有了xml绑定会自动生成
        User user;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mViewDataBinding=DataBindingUtil.setContentView(this,R.layout.activity_mvvm);
            user=new User();
            findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //模拟数据更新
                    user.setUserName("android "); ;
                    mViewDataBinding.setUser(user);
                }
            });
            user.setUserName("android222");
            mViewDataBinding.setUser(user);
            mViewDataBinding.setMyHandlers(new MVVMViewModel());
        }
    }
    

    ##更优雅的MVVM+jetpack例子

    相关文章

      网友评论

          本文标题:Android MVVM

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