写点什么

帮助你快速使用 Android 的 LiveData 与 ViewModel

用户头像
Android架构
关注
发布于: 16 小时前
  • 支持?ViewModelAndroidViewModel。(默认为?ViewModel

  • 支持?observeobserveForever?两种观察模式。(默认为?observe

  • 支持?SingleLiveEventMediatorLiveDataMutableLiveData。(默认为?MutableLiveData

  • 支持自定义LiveData类型。

  • 支持事件总线的操作。

  • Forever 模式自动取消订阅。


详细介绍





使用方式




添加依赖


implementation 'com.github.simplezhli.saber:saber-api:0.2.4'


//AndroidX 使用


implementation 'com.github.simplezhli.saber:saberx-api:0.2.4'


annotationProcessor 'com.github.simplezhli.saber:saber-compiler:0.2.4'


首先创建一个类,使用@LiveData注解标记你要保存的数据。注意这里的参数名称 value,下面会用到。


public class SeekBar {


@LiveData


Integer value;


}


当然也可以直接标记你的 JavaBean,来直接保存此类。那么参数名为类名的首字母小写:seekBar


@LiveData


public class SeekBar {


Integer value;


}


使用@LiveData(classType = LiveDataClassType.LIST)可以指定对应的数据集合类型


Build -- > Make Project 会生成代码如下:


public class SeekBarViewModel extends ViewModel {


private MutableLiveData<Integer> mValue;


public MutableLiveData<Integer> getValue() {


if (mValue == null) {


mValue = new MutableLiveData<>();


}


return mValue;


}


public Integer getValueValue() {


return getValue().getValue();


}


public void setValue(Integer mValue) {


if (this.mValue == null) {


return;


}


this.mValue.setValue(mValue);


}


public void postValue(Integer mValue) {


if (this.mValue == null) {


return;


}


this.mValue.postValue(mValue);


}


}


如果想使用AndroidViewModel的话,可以添加@AndroidViewModel注解


@AndroidViewModel


public class SeekBar {


@LiveData


Integer value;


}


自定义LiveData类型


public class Single {


@LiveData(type = LiveDataType.OTHER, liveDataType = XXXLiveData.class)


Integer value;


}


生成代码提供了 LiveData 的常用操作。


  • setXXX()要在主线程中调用。

  • postXXX()既可在主线程也可在子线程中调用。

  • getXXX()用于获取观察者。

  • getXXXValue()可以获取保存的数据。

  • addSource()用于监听 LiveData。(MediatorLiveData 专用)

  • removeSource()移除监听的 LiveData。(MediatorLiveData 专用)

1. 普通使用方法

一般情况下可以直接使用它。比如:


public class TestFragment extends Fragment {


private SeekBar mSeekBar;


@BindViewModel(isShare = true) //<--标记需要绑定的 ViewModel


SeekBarViewModel mSeekBarViewModel;


@Override


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


// Inflate the layout for this fragment


View root = inflater.inflate(R.layout.fragment_test, container, false);


mSeekBar = root.findViewById(R.id.seekBar);


Saber.bind(this); // <--这里绑定 ViewModel


subscribeSeekBar();


return root;


}


private void subscribeSeekBar() {


mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {


@Override


public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {


if (fromUser) {


mSeekBarViewModel.setValue(progress);


}


}


......


});


}


@OnChange(model = "mSeekBarViewModel") //<--接收变化的 ViewModel 变量名


void setData(Integer value){ //注意这里使用 @LiveData 标记的参数名


if (value != null) {


mSeekBar.setProgress(value);


}


}


}


@BindViewModel用于绑定 ViewModel。


@OnChange(model = "xxx")用于接收指定 ViewModel 的数据变化,可以不设置,默认 model 名称为 mViewModel。


如果需要Fragment之间数据共享,需要@BindViewModel(isShare = true),当然也要保证传入相同的 key 值。默认 key 值是类的规范名称


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


,也就是包名加类名。



所以一旦需要互通的 Fragment 类名或包名不一致,就无法数据共享。这时可以指定 key 值:@BindViewModel(key = "value")

2. 事件总线使用方法,详细用法参看 LiveEventBus

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
帮助你快速使用 Android 的 LiveData 与 ViewModel