Jetpack学习笔记(MVVM+Jetpack+LiveData)

好处

  • 谷歌官方推崇, 未来的开发主流架构
  • 方便快捷,减少了代码量
  • 可以让 Activty/Fragment 实现单一职能原则
  • 因为框架内部做了很多处理,所以可以帮我们规避很多问题

使用步骤

本文仅作为学习笔记,记录最基础的用法。

1. 配置

AndroidX已经默认集成jeckpack,无需添加额外依赖。
如果你还没有使用AndroidX,强烈建议早日入坑。

开启dataBing:

android {
    ...  
    dataBinding {
        enabled = true
    }
}    

2. 新建ViewModel

什么是ViewModel?
简单来说,ViewModel 主要用来 管理数据集 ,可以极大地简化 Activty 的工作量。

step 1. 建立ViewModel 类

一般来说,ViewModel 命名与 对应的Actvity 保持一致。
eg. MainActivity ==>MainViewModel

建立 ViewModel 也是很简单。只要 extends ViewModel 就可以了。

public class MainViewModel extends ViewModel {
   ...
}

如果,在 ViewModel 中,需要使用到 Context ,就需要 extends AndroidViewModel ,并添加构造方法。

public class MainViewModel extends AndroidViewModel {
    public MainViewModel(@NonNull Application application) {
        super(application);
    }
}

step 2. 添加数据集

数据集 其实说白了,就是指的变量嘛。这里的数据分为两种,有感应的,无感应的。

  • 无感应的,和平常定义变量方法一样。
private String aa = "";
  • 有感应的数据集 就是利用 LiveData 来实现的数据感应。在定义的时候,也需要使用LiveData。但是更推荐使用其子类 MutableLiveData,相比较而言功能更多一些。
// 这么写是可以的,但是不推荐
private LiveData<String> aa;
// 推荐使用其子类 MutableLiveData
private MutableLiveData<String> aa;

添加了数据集之后需要将其暴露出去,因为不暴露出去,无法在其它地方引用。
需要注意的是,LiveData 类型的数据,只可以使用getValue ,setValue 尽情取值赋值,不可以直接用 = 进行属性操作。

    public MutableLiveData<String> getA() {
        if (a == null) {
            a = new MutableLiveData<>();
            a.setValue("0");
        }
        return a;
    }

step 3. 添加方法

需要注意的是,方法必须为public。

public void plusOne() {
    aa.setValue(Integer.parseInt(aa.getValue()) + 1 + "");
}

3. 布局中使用

step 1. 转换布局

把布局文件转换成data binding layout。简单说,就是加一层layout父标签,加一个data兄弟标签。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    data>
    
    ... 你真正的 布局文件内容 ... 
    
layout>

手动转当然也可以,只不过Android Studio 也已经帮助我们提供了自动转换的功能,把鼠标放到布局的根标签,就会有自动提示的转换选项。
Jetpack学习笔记(MVVM+Jetpack+LiveData)_第1张图片

step 2. 绑定ViewModel

仅在data 标签下,增加 variable 标签即可。 其中 name 属性随便起名即可,type 需要指定为对应 ViewModel 的全类名。

<data>
    <variable
        name="vm"  
        type="top.vchao.jackpackdemo.MainViewModel" />
data>

name属性指定之后,编译器编译后会自动生成setXXX()方法,XXX 即为 name属性值。

step 3. 布局文件中使用ViewModel

这里只记录最简单的用法。
属性:

 android:text="@{vm.aa}"

方法:

android:onClick="@{()->vm.plusOne()}"

4. Activity 管理工作

step 1. 绑定布局文件

jetpack 不能再像原来一样直接setContentView,需要转换成如下写法:

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 转换为 ActivityMainBinding 
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    }
}

step 2. 绑定ViewModel

如3.2所言,setVm方法为编译器编译后会自动生成的方法,依据 name属性值生成。如未找到该方法,可以重新编译尝试。

       binding.setVm(new MainViewModel(getApplication()));

step 3. 设置感知数据变化

       binding.setLifecycleOwner(this);

至此,最简单的使用流程已经记录完毕。


你可能感兴趣的:(美好的开始)