特征:
1.首先LiveData 其实与数据实体类是一样的东西,它负责暂存数据
2.其次LiveData 其实也是一个观察者模式的数据实体类,它可以跟它注册的观察者回调数据是否已经更新
3.LiveData 还能知晓它绑定的Activity或者Fragment的声明周期,它只会给前台活动的activity回调,这样可以放心的在它的回调方法里直接将数据添加到View,而不用担心会不会报错
LiveData 与MutableLiveData区别:
1.MutableLiveData的父类是LiveData
2.LiveData在实体类里可以通知指定某个字段的数据更新
3.MutableLiveData则是完全是整个实体类或者数据类型变化后才通知,不会细节到某个字段
LiveData不可变,MutableLiveData是可变的
DemoData.java
public class DemoData extends LiveData<DemoData> {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
postValue(this);
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
postValue(this);
}
}
继承LiveData并且在泛型里写下你的实体类,注意的是:postValue(this),这个方法是用于回调数据更新的方法(在需要被观察的数据里添加)
创建ViewModel
需要在ViewModle实例化DemoData这个类(ViewModle是用于管理多个Activity或者Fragment数据的类)
public class DemoViewModel extends ViewModel {
private DemoData data = new DemoData();
public DemoData getData(){
return data;
}
}
在Activity或者Fragment中绑定
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private DemoViewModel mDemoViewModel;
private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = findViewById(R.id.btn);
//获取ViewModel,让ViewModel与此activity绑定
mDemoViewModel = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(DemoViewModel.class);
//注册观察者,观察数据的变化
mDemoViewModel.getData().observe(this, new Observer<DemoData>() {
@Override
public void onChanged(DemoData demoData) {
Log.d(TAG, "onChanged: " + demoData.getX());
}
});
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDemoViewModel.getData().setX(10);
}
});
}
}
MutableLiveData
public class MutableLiveData<T> extends LiveData<T> {
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
注意:
postValue
1.此方法可以在其他线程中使用
2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值
3.如果同时调用setValue(a)和postValue(b),一定是值b被a覆盖
setValue:此方法只能在主线里调用
因为MutableLiveData只是作用变量所以我们直接就可以在ViewModel里面实例化它,并且在泛型里标注变量的类型
public class DemoViewModelMutable extends ViewModel {
private MutableLiveData<String> mString = new MutableLiveData<>();
public MutableLiveData<String> getString(){
return mString;
}
public void setString(String s){
mString.setValue(s);
}
}
绑定
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private DemoViewModelMutable mDemoViewModel;
private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = findViewById(R.id.btn);
//获取ViewModel,让ViewModel与此activity绑定
mDemoViewModel = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(DemoViewModelMutable.class);
//注册观察者,观察数据的变化
mDemoViewModel.getString().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d(TAG, "onChanged: " + s);
}
});
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDemoViewModel.setString("hahahaha");
}
});
}
}