LiveData是什么
可观察的数据存储类,具有生命周期感知能力
简单使用
一般和ViewModel使用;自定义ViewModel
public class LiveDataSub extends ViewModel {
private MutableLiveData<String> infos;
private int number;
public MutableLiveData<String> getInfos() {
if (infos==null){
infos = new MutableLiveData<>();
}
return infos;
}
public int increaseNumber(){
number++;
return number;
}
}
MutableLiveData类型;提供访问方法getInfo
在Activity中使用:lifecycle-viewmodel-2.1.0-sources中的ViewModelProvider
public class LiveDataActivity extends AppCompatActivity {
private TextView tv;
private LiveDataSub viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_data);
tv = findViewById(R.id.tv);
// v2.2.0之后弃用了ViewModelProviders.of(2.0.0可用);建议用 new ViewModelProvider 方式。
viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(LiveDataSub.class);
// 监听info改变
viewModel.getInfos().observe(this, s -> tv.setText(s));
// 改变info值
tv.setOnClickListener(v -> {
String info = "info:" + viewModel.increaseNumber();
viewModel.getInfos().setValue(info);
});
}
}
通过ViewModelProvider来实例化定义ViewModel,调用LiveData的observer添加当前Activity观察。
通过LiveData的setValue更新数据,界面会自动更新。
原理
observer方法调用要求在主线程。如果activity对应的lifecycle已经处于Destroy状态,则会直接返回,不添加observer。最终还是调用了lifecycle的addObserver方法。
数据更新,通过LiveData的setValue。要求在主线程执行。内部调用dispatchingValue方法,最终调用onChange。