当活动旋转时,ViewModel如何不被销毁

3

我很好奇当Activity因旋转而被销毁并重新创建时,ViewModel是如何存活下来的。从逻辑上看,如果创建ViewModel的Activity被销毁,那么ViewModel也会被销毁。而旋转设备时,Activity会被销毁。

ViewModel如何知道Activity已经完全结束,以便我可以销毁自己呢?因为如果设备旋转,onDestroy方法也会被调用多次。因此,当Activity完全销毁时,ViewModel的onCleared方法如何被触发?


它可以帮助您找到答案。https://arkadiuszchmura.com/posts/how-viewmodels-survive-configuration-changes/ - Foroogh Varmazyar
2个回答

2
理论 -> 在 ViewModelStore 中有一个类型为 HashMap<String, ViewModel> 的哈希映射表(可以从活动中调用 getViewModelStore() 获取),它存储了 ViewModel 的状态,并用于在下一个 onCreate 中获取现有的 ViewModel,这就是 ViewModel 在配置更改后如何生存下来的方式。 因此,当调用其 clear() 方法时,ViewModel 就会被销毁,而 viewModelStore 的 clear 方法内部调用了 viewModel 的 clear 方法。
回答您的问题, 存在一种内部检查,如果是由于配置更改而调用 onDestroy,则避免调用该 clear 方法。
参考 ComponentActivity 源代码 ->
 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();
                    }
                }
            }
        });

注意isChangingConfiguration的if检查,这就是为什么在配置更改时不调用clear的原因。
再看一下源代码中的isChangingConfigurations()方法:
返回值: 如果活动正在被拆除以便使用新配置重新创建,则返回true;否则返回false。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接