Jetpack之ViewModel的基本使用

1.什么是ViewModel

在说ViewModel之前,我们需要了解一下MVVM和DataBinding,使用过DataBinding的小伙伴们都知道,它有一个明显的缺点,主要是在绑定数据的时候如果发生了问题很难排查,这样就没有一个合适的ViewModel规范来帮助开发者来实现MVVM。
在2017年的Google I / O大会上,谷歌推出了ViewModel组件,来规范ViewModel层。所谓ViewModel,其实就是通过感知生命周期的方式来管理和存储视图相关的数据。ViewModel主要有以下几个特点:

  1. .当Activity被销毁时,我们可以使用onSaveInstanceState()方法恢复其数据,这种方法仅适用于恢复少量的支持序列化、反序列化的数据,不适用于大量数据,如用户列表或位图。而ViewModel不仅支持大量数据,还不需要序列化、反序列化操作。
  2. .Activity/Fragment(视图控制器)主要用于显示视图数据,如果它们也负责数据库或者网络加载数据等操作,那么一旦逻辑过多,会导致视图控制器臃肿,ViewModel可以更容易,更有效的将视图数据相关逻辑和视图控制器分离开来。
  3. .视图控制器经常需要一些时间才可能返回的异步调用,视图控制器需要管理这些调用,在合适的时候清理它们,以确保它们的生命周期不会大于自身,避免内存泄漏。而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的生命周期的变化引发数据存储和内存泄露的问题。

猜你喜欢

转载自blog.csdn.net/qq_39431405/article/details/117958047