一起Talk Android吧(第三百八十六回:ViewModel)
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起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的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
以上是关于一起Talk Android吧(第三百八十六回:ViewModel)的主要内容,如果未能解决你的问题,请参考以下文章
一起Talk Android吧(第三百八十八回:lifecycle)
一起Talk Android吧(第三百八十八回:lifecycle)
一起Talk Android吧(第三百八十七回:LiveData)
一起Talk Android吧(第三百八十七回:LiveData)