0
点赞
收藏
分享

微信扫一扫

Android MVVM开发框架


MVVM

数据双向绑定,通过数据驱动UI,M提供数据,V视图,VM即数据驱动层

MVP框架图 (图片来源于网络)

Android MVVM开发框架_android

学习MVVM开发框架,要先了解DataBinding,DataBinding 是什么?

DataBinding是谷歌官方发布的一个实现数据绑定的框架(实现数据与视图双向绑定)。

DataBinding可以帮助我们在安卓中更好的实现MVVM模式。

DataBinding 使用步骤
1.启动DataBinding

app中的build.gradle 中的android{}里面添加

dataBinding{
    enabled=true
}

2.修改布局文件为DataBinding布局

选择 LinearLayout ,然后Alt+回车键 ,选择data binding layout

Android MVVM开发框架_Android_02

改成layout

Android MVVM开发框架_DataBinding_03

3.数据绑定

xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewModel"
            type="com.rain.mvvm_demo.view.ViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center"
        tools:context=".mvvm.MvvmActivity">
        <EditText
            android:id="@+id/et_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="输入框"/>

        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="获取内容"
            android:onClick="@{viewModel.getData}"/>


        <TextView
            android:id="@+id/content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.result}"/>
    </LinearLayout>
</layout>

案例

Android MVVM开发框架_xml_04

逻辑代码

CallBack

/**
 * 数据返回接口
 */
public interface CallBack {
    void onSuccess(Account account);
    void onFailed();
}

Account 实体类

public class Account  extends BaseObservable {
    private String name;
    private int level;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @Bindable
    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
        notifyPropertyChanged(BR.level);
    }
}

MvvmModel model层

public class MvvmModel {

    public void setAccountData(String accountName, CallBack callBack){
        Random random=new Random();
        boolean isSuccess=random.nextBoolean();
        if (isSuccess){
            Account account=new Account();
            account.setName(accountName);
            account.setLevel(100);
            callBack.onSuccess(account);
        }else {
            callBack.onFailed();
        }
    }
}

ViewModel vm

public class ViewModel extends BaseObservable {
    private MvvmModel mvvmModel;
    private String result;
    ActivityMainBinding binding;
    Application application;

    public ViewModel(Application application) {
        mvvmModel=new MvvmModel();
    }

    public ViewModel(Application application, ActivityMainBinding binding) {
        this.application=application;
        mvvmModel=new MvvmModel();
        this.binding=binding;
    }

    public void getData(View view){
        switch (view.getId()){
            case  R.id.btn:
                String userInput=binding.etText.getText().toString();
                mvvmModel.setAccountData(userInput, new CallBack() {
                    @Override
                    public void onSuccess(Account account) {
                        String info=account.getName()+"|"+account.getLevel();
                        setResult(info);
                    }

                    @Override
                    public void onFailed() {
                        setResult("获取数据失败");
                    }
                });
                break;
            default:
                break;
        }

    }


    @Bindable
    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
        notifyPropertyChanged(BR.result);
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {
     ActivityMainBinding binding;
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding= DataBindingUtil.setContentView(this, R.layout.activity_main);

        ViewModel viewModel=new ViewModel(getApplication(),binding);

        binding.setViewModel(viewModel);
    }

}

MVVM 优缺点

优点

1. 减少了接口数量

2.告别繁琐FindViewById 操作

3.实现了数据和视图的双向绑定,极大的简化代码

缺点

bug难以调试,并且dataBinding目前还存在一些编译问题,不过MVVM

会越来越好,值得学习,极力推荐。

LiveData+ViewModel

代码获取

公众号: 轻语积累

回复关键字: 源码

举报

相关推荐

0 条评论