ViewModel如何在Activity中保证留存性

ViewModel如何在Activity中保证留存性

简介:

ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。

相关链接:

ViewModel 概览 | Android 开发者 | Android Developers (google.cn)

1.ViewModel的创建入口 MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
以上可以看得出ViewModel的创建由ViewModelProvider提供,那么继续查看ViewModelProvider的实现。

2.new ViewModelProvider(this) 构造器其实只是简单的赋值引用,那么详细的方法应该是在get里面。
在这里插入图片描述

从上可以看出具体的实现还在下一个get方法。

在这里插入图片描述

​ 其中我们可以看到,viewModel是以键值对的形式存储在mViewModelStore当中。那么调用和这个方法的时候会判断实例的类型和viewmodel有没有和创建过,如果没有调用前面构造里面的工厂进行创建,创建完成后存储进mViewModelStore中。

3.查看mViewModelStore详情
在这里插入图片描述

​ 查看里面的源码,符合我们一开始的猜想,viewmodel的存储是通过键值对来实现的。
在这里插入图片描述

4.那么我们现在要思考一个问题,这个mViewModelStore是从哪里来的。 查看构造器的详情。 我们可以看到mViewModelStore是在构造器中进行赋值。

5.那么我们继续查看当前的owner.getViewModelStore()这个方法是从哪里获取的值。 从下我们可以看到是一个接口,我们看看这个接口的实现类型有哪些。
在这里插入图片描述

在这里插入图片描述

​ 点击查看发现,有个activity,那么我们就进去点他。

6.查看activity中的具体实现。

在这里插入图片描述

其中,关键在与 mViewModelStore = nc.viewModelStore; 这代码对mViewModelStore进行了赋值操作,同时我们也能发现ViewModelStore是activity中的私有成员变量。那么我们看看getLastNonConfigurationInstance这个方法是干什么的。
在这里插入图片描述

​ 从注释中我们可以知道,这个方法是获取上一个被意外销毁的activity的实例配置,同时需要注意的是,这个方法之只在oncreate和onstart之间可用。也就是说,假如activity因为配置改变而重新创建的时候,在旧的activity还没有完全销毁,新的activity还没有完全创建完成的时候,即在oncreate和onstart这短暂的时间里,新的activity会持有旧的activity的引用,并完成viewmodel之间的引用传递,然后旧的activity将会被销毁。

猜你喜欢

转载自blog.csdn.net/tao_789456/article/details/122869744
今日推荐