目录
观察者模式是什么?
-
你有一个变量,会有一个监听器去监听这个变量,当变量发生变化时监听器会触发并做出你想要的操作。
-
其中,这个被监听的变量就是被观察的对象,当这个对象发生变化时我们可以触发回调并进行相应处理。
1.创建ViewModel的子类myViewModel
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> myVariable = new MutableLiveData<>(); //livedata的具体类,为可变livedata,可以更改并在观察者模式观察并随时更新
public MyViewModel(){
}
public LiveData<Integer> getMyVariable() {
return myVariable;
}
public void setMyVariable(int value) {
//myVariable.setValue(value);
myVariable.postValue(value); //postvalue用于在主线程更新value,避免产生异常
}
}
为什么要继承自ViewModel?
因为在Android中,ViewModel是用于管理UI相关数据和业务逻辑的类。它能帮助开发者在配置变化时保持数据一致性,避免生命周期导致一些数据异常等,能将数据存储在ViewModel中保证数据在配置变化时不会丢失。(相当于数据和活动分开了,但是又能保持通信)
MutableLiveData是什么?
这是一个继承自Livedata的存储数据的类,其中构造函数参数是T,所以你可以自定义数据类型。它可以在数据变化后通知回调函数。这就是我们需要被观察的那个变量。
getMyVariable和setMyVariable是什么?
这是用来获取我们实例化的那个被观察变量和给被观察变量赋值的。
其中,setValue()只能在主线程使用,而postValue()可以在其他线程使用,它会将这个操作提交到主线程的消息队列里。这两个方法都是用于更新被观察变量的。
2.创建MyViewModel并实例化
public MyViewModel myViewModel;
public class MyViewModelFactory implements ViewModelProvider.Factory {
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
if (modelClass.isAssignableFrom(MyViewModel.class)) {
return (T) new MyViewModel();
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
}
//onCreateView内
myViewModel = new ViewModelProvider(this, new MyViewModelFactory()).get(MyViewModel.class);
//onResume内
myViewModel.getMyVariable().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer value) {
if (value == 1) {
//执行你想在监听后进行的操作
handler.postDelayed(Show_workmatesRunnable, 5000);
myViewModel.setMyVariable(0);
}
}
});
//其他要想执行监听回调的地方
myViewModel.setMyVariable(1);
我的系统默认的ViewModelProvider.Factory
无法创建MyViewModel
实例。所以需要自定义实例来处理ViewModel的创建。
实例化后就可以使用了。
使用livedata的observe方法就可以以观察者的方式监听数据变化了。