接着上一篇JetPack(二)ViewModel小试牛刀, 我们再来了解一下LiveData
在上一篇的demo上加上LiveData
MyViewModel
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> number;
/**
* 保证linkedNumber不为空
*
* @return
*/
public MutableLiveData<Integer> getNumber() {
if (number == null) {
number = new MutableLiveData<>();
number.setValue(0);
}
return number;
}
/**
* 增加number
* @param n
*/
public void addNumber(int n) {
number.setValue(number.getValue() + n);
}
}
Activity
public class MainActivity extends AppCompatActivity {
MyViewModel myViewModel;
TextView textView;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
// Activity重新创建时保存number值
button = findViewById(R.id.button);
// 绑定ViewModel
myViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
// 创建Observe对象
final Observer<Integer> nameObserver = new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
textView.setText(String.valueOf(integer));
}
};
// LiveData观察
myViewModel.getNumber().observe(this, nameObserver);
// 上面的简写
/* myViewModel.getNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
textView.setText(String.valueOf(integer));
}
});*/
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.addNumber(1);
}
});
}
}
代码很清晰,就是先在ViewModel里创建LiveData对象,这里因为数据的控制都放在ViewModel中,所以不建议将LIveData放在Activity或者Fragment里写;第二步是观察LiveData对象;最后一步是最终目的,观察就是为了在button监听里更新LiveData对象。
当然我们还可以将LiveData与Room一起使用,也可以对LiveData进行扩展和转换。这里只是简单了解LiveData使用,详细请参照官网https://developer.android.google.cn/topic/libraries/architecture/livedata?hl=zh_cn#create_new_transformations
下一篇我们来体验一下很好玩的DataBinding JetPack(四)DataBinding大法好