旋转活动时如何不破坏视图模型



我很想知道当活动被旋转时,ViewModel 是如何生存的,因为它被破坏并再次重新创建。从逻辑上讲,如果我们看到,如果负责创建视图模型的活动被销毁,则视图模型将被销毁。当我们旋转设备时,活动正在破坏。

视图模型如何知道活动已完全完成,以便我可以摧毁自己?因为如果设备旋转,onDestroy 也会被多次调用,那么当活动完全销毁时,ViewModel 的 onCleared 方法是如何触发的呢?

理论 -> 在ViewModelStore中有一个类型为HashMap<String,ViewModel>的哈希图(您可以从您的活动中调用getViewModelStore((来获取它(,它存储ViewModel状态及其用于在下一个onCreate中获取现有viewModel的状态,这就是ViewModel在配置更改中幸存下来的方式。 因此,当 viewModel 的 clear(( 方法被调用时,viewModelStore 的 clear 方法在内部调用 viewModel 的 clear 时,ViewModel 就会被销毁。

为了回答你的问题, 存在内部检查,如果由于配置更改,则可以避免在onDestroy中调用此清除方法。

参考组件活动源代码 ->

 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();
                    }
                }
            }
        });

请注意 if 检查 isChangeConfiguration,这就是为什么在配置更改时不调用 clear 的原因

再次从源代码 isChangeConfiguration((

返回: 如果正在拆除活动以便使用新配置重新创建,则返回 true;否则返回假。

ViewModels 是生命周期感知的,这意味着当您创建视图模型时,您将LifecycleOwner传递给 VM。这有助于视图模型获取上下文的状态(无论是活动、片段等(。 这允许视图模型仅在状态处于活动状态时将更改广播到其观察者。

请参阅以下链接以更清晰地了解

https://developer.android.com/topic/libraries/architecture/lifecycle#lco https://codelabs.developers.google.com/codelabs/android-lifecycles/#4

相关内容

  • 没有找到相关文章

最新更新