1.什么是ViewModel
在说ViewModel之前,我们需要了解一下MVVM和DataBinding,使用过DataBinding的小伙伴们都知道,它有一个明显的缺点,主要是在绑定数据的时候如果发生了问题很难排查,这样就没有一个合适的ViewModel规范来帮助开发者来实现MVVM。
在2017年的Google I / O大会上,谷歌推出了ViewModel组件,来规范ViewModel层。所谓ViewModel,其实就是通过感知生命周期的方式来管理和存储视图相关的数据。ViewModel主要有以下几个特点:
- .当Activity被销毁时,我们可以使用onSaveInstanceState()方法恢复其数据,这种方法仅适用于恢复少量的支持序列化、反序列化的数据,不适用于大量数据,如用户列表或位图。而ViewModel不仅支持大量数据,还不需要序列化、反序列化操作。
- .Activity/Fragment(视图控制器)主要用于显示视图数据,如果它们也负责数据库或者网络加载数据等操作,那么一旦逻辑过多,会导致视图控制器臃肿,ViewModel可以更容易,更有效的将视图数据相关逻辑和视图控制器分离开来。
- .视图控制器经常需要一些时间才可能返回的异步调用,视图控制器需要管理这些调用,在合适的时候清理它们,以确保它们的生命周期不会大于自身,避免内存泄漏。而ViewModel恰恰可以避免内存泄漏的发生。
2.ViewModel的基本使用
2.1 添加依赖
implementation "android.arch.lifecycle:extensions:1.1.1"
2.2 自定义ViewModel
public class MyViewModel extends ViewModel {
private MutableLiveData<String> name ;
public MutableLiveData<String> getName (){
if(name == null){
name = new MutableLiveData<String>();
}
return name;
}
}
2.2 使用ViewModel
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textview);
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getName().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
textView.setText(s);
}
});
model.getName().setValue("hello ViewModel");
}
}
3.ViewModel的生命周期
从这附图可以看出来,Activity的生命周期不断变化,经历了被销毁重新创建,而ViewModel的生命周期没有发生变化。这就解决了随着Activity的生命周期的变化引发数据存储和内存泄露的问题。