美文网首页
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