ViewModel生命周期疑问

ViewModel生命周期疑问

​网上搜到的一些说法是跟随宿主

val viewModel = ViewModelProvider(this).get(HiViewModel::class.java)

this 就是宿主上下文


然后课程分析ViewModel的数据保存与恢复,实际上利用到了ActivityThread,那么按这个理论,ViewModel的生命周期应该比宿主长才对,那么ViewModel具体的生命周期是怎样的呢(创建和销毁的时机是怎样的)


请教一下老师,有没推荐文章看下,或者详细说下,网上说法感觉不太准确

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

ViewModel的数据保存与恢复,实际上利用到了ActivityThread,那么按这个理论,ViewModel的生命周期应该比宿主长才对,那么ViewModel具体的生命周期是怎样的呢。

这段理解是没问题的话哈

1. 有一点要了解我们获取viewmodel的时候,源码跟进去,你会发现是从viewModelStore中获取得到的

2.  在activity 因为内存不足或系统配置变更导致的activity 被销毁时,会执行onsavedInstance方法,入参为bundle,activity 会把viewModelStore实例对象存储在NoConfigrationInstance对象里,进而存储在bundle中。此时是不是意味着虽然activity 即将被销毁但是viewModelStore ,以及viewModel是被保存了下来的。

3.  当activity 恢复重建时,onCreate有个bundle入参,会把之前保存的对象传递过来,新的activity 实例会从bundle 中解析并恢复viewModelStore ,进而能够恢复viewModel 。

4.  以上是activity 被异常销毁时才会触发的。当activity 正常执行finish被销毁时,在ComponentActivity源码中你可以看到会触发viewModelStore 的onClear方法。这也意味着viewModel 即将被销毁

  • 默小铭 提问者 #1

    了解了,看到相关源码了,谢谢老师

    getLifecycle().addObserver(new LifecycleEventObserver() {

                @Override

                public void onStateChanged(@NonNull LifecycleOwner source,

                        @NonNull Lifecycle.Event event) {

                    if (event == Lifecycle.Event.ON_DESTROY) {

                        // Clear out the available context

                        mContextAwareHelper.clearAvailableContext();

                        // And clear the ViewModelStore

                        if (!isChangingConfigurations()) {

                            getViewModelStore().clear();

                        }

                    }

                }

            });

            getLifecycle().addObserver(new LifecycleEventObserver() {

                @Override

                public void onStateChanged(@NonNull LifecycleOwner source,

                        @NonNull Lifecycle.Event event) {

                    ensureViewModelStore();

                    getLifecycle().removeObserver(this);

                }

            });


    2021-08-22 17:48:09
  • 老师这个说法的话,要ViewModel-SaveState相关的机制就没有啥意义了?ViewModel-SaveState它不是做内存不足的时候数据保存的吗。

    2022-03-17 21:32:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师