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的生命周期的变化引发数据存储和内存泄露的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值