一起Talk Android吧(第三百八十六回:ViewModel)

各位看官们,大家好,上一回中咱们说的是数据绑定的例子,这一回中咱们介绍的例子是ViewModel。闲话休提,言归正转,让我们一起Talk Android吧!

概念介绍

我们介绍的ViewModel是Jetpack中的一个库,它主要用来管理数据,有看官说管理数据的方法很多呀,为什么要用它?因为它使用生命周期的方式去管理数据。它的生命周期和Activity的生命周期一致,通常是在Activity第一次调用onCreate()时启动直到Activity回调onDestroy()时才结束,下面是从官方文档截取的图片:
在这里插入图片描述

从图片中可以直观地看出ViewModel的整个生命周期。Fragment的生命周期和Activity类似,因此ViewModel也可以管理Fragment中的数据,除此之外ViewModel还可以用来在多个Fragment之间共享数据。

使用方法

1.在项目中添加依赖

  implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'

2.自定义类ViewModel

我们定义了名叫MainViewModel的类,此类继承于ViewModel,类中属性为int类型的数据,并且给属性添加setter/getter方法;
此外,我们在类中创建了两个构造方法,一个无参数,另外一个有参数,类的具体代码如下,请参考:

public class MainViewModel extends ViewModel {
    private int mCounter;

    //两个构造方法,一个无参数,成员的值默认为0
    public MainViewModel() {
        mCounter = 0;
    }

    //两个构造方法,一个有参数,成员的值为参数值
    public MainViewModel(int counter) {
        mCounter = counter;
    }
    //成员的getter/setter方法
    public int getCounter() {
        return mCounter;
    }

    public void setCounter(int counter) {
        mCounter = counter;
    }
}

3.创建ViewModel类的对象

使用ViewModelProvider的get方法来初始化ViewModel对象而不是使用传统的new()方法来创建对象,(ViewModelProvider有多个构造方法,也可以使用带Factory接口类型参数的构造方法),不同构造方法的区别在于带Factory接口类型的构造方法可以传递参数,另外一种则不可以。

通过这两种方式创建的对象可以保证在整个ViewModel的生命周期内ViewModel中的数据不会丢失。而Activity则会因为生命的周期的变化导致Activity中的数据丢失,比如Activity因为屏幕旋转或者切换画面会引起生命周期发生变化,此时会引起Activity中的数据丢失或者变化。

回想一下我们在开始时介绍过ViewModel的生命周期,它贯穿了整个Activity的生命周期。把Activity和ViewModel关联后就可以解决Activity因为生命周期变化导致的数据丢失问题。这也是Jetpack中引入ViewModel的主要原因。下面是创建ViewModel对象的示例代码,请参考:

//两种创建ViewModel对象的方法:第一种方法调用自定义ViewMode类的无参构造方法
mMainViewModel = new ViewModelProvider(getActivity()).get(MainViewModel.class);
//两种创建ViewModel对象的方法:第二种方法调用自定义ViewModelFactory类的有参构造方法
//mMainViewModel = new ViewModelProvider(getActivity(),new MainViewModelFactory(3)).get(MainViewModel.class);

//自定义ViewModelFactory类,实现了ViewModelProvider的Factory接口
public class MainViewModelFactory implements ViewModelProvider.Factory {
    private int count;
    public MainViewModelFactory(int count) {
        this.count = count;
    }
    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        return (T) new MainViewModel(count);
    }
}

4.查看程序运行结果

在布局中创建一个TextView,把ViewModel中的数据显示在这个TextView上,旋转手机屏幕,观察TextView中显示的内容,我们就会发现它的内容一直保持不变。这便是使用ViewModel带来的好处,下在是示例代码,请大家参考:

       mTextView.setText(String.valueOf(mMainViewModel.getCounter()));

看官们,关于Android中ViewModel的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值