一起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)

一起Talk Android吧(第三百八十三回:视图绑定-ViewBinding)

一起Talk Android吧(第三百三十六回: Android中的volley一)