之前一直使用MVP开发。刚上班看一下MVVM。LiveData+ViewModel确实比较给力,但看到databinding感觉xml写法复杂了很多,先记录下LiveData配合ViewModel使用。
LiveData 优点
不会再产生由于Activity处于stop状态而引起的崩溃。如果观察者的生命周期是不活跃的,例如 activity 处于后台,那么将不会收到任何 LiveData 事件。
总是实时刷新数据。当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据
数据共享。多个页面同时监听同一个状态
ViewModel优点
存放与UI有关的数据,将UI与数据分割开。
最简单的用法
1.创建ViewModel
public class SimpleViewModel extends ViewModel {
private MutableLiveData<String> content;
public MutableLiveData<String> getContent() {
if (content == null) {
content = new MutableLiveData<>();
}
return content;
}
public void setContent(MutableLiveData<String> content) {
this.content = content;
}
/**
* 获取数据
*/
public void getContentData() {
//这里可以加一层Repository从网络/缓存加载数据
//执行完毕后调用 setValue/postValue方法,最终会回调Activity中的onChange方法
content.setValue("我是获取到的数据");
//子线程调用 content.postValue(""我是获取到的数据");
}
}
- ViewModel创建完成后, Activity去调用ViewModel
btn = findViewById(R.id.btn);
//构建ViewModel对象
final SimpleViewModel model = ViewModelProviders.of(this).get(SimpleViewModel.class);
//监听content属性变化,只要触发了setValue/postValue方法就会走
model.getContent().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
Log.e("SimpleActivity", "onChanged");
btn.setText(s);
}
});
//起始点
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发起获取数据
model.getContentData();
}
});
参考链接
https://www.jianshu.com/p/9e56c206956e
https://www.jianshu.com/p/b1208012b268