【问题标题】:How ViewModel retains data?ViewModel 如何保留数据?
【发布时间】:2022-10-05 13:43:00
【问题描述】:

viewModel 如何保留由于配置更改而不是当我们尝试重新实例化活动时的数据。

ViewModel 对象的作用域是在获取 ViewModel 时传递给 ViewModelProvider 的生命周期。 ViewModel 会一直保留在内存中,直到其范围内的生命周期永久消失

 viewModel = ViewModelProviders.of(this)[MainActivityViewModel::class.java]

这里这个是生命周期所有者 MainActivity。
旋转/配置更改之前: 旋转/配置更改后:

我们可以在这里清楚地看到活动实例(所有者)和生命周期在轮换后发生了变化。那么为什么它只在配置更改时保存数据。同时,当我尝试手动创建相同活动的新实例以重新创建此场景时,视图模型未保留数据。

视图模型是否保留数据的决定性参数是什么。
以及为什么 viewModel 只为配置更改而不是为相同活动的新实例保留数据。

【问题讨论】:

  • @CommonsWare 文档仍然没有回答问题
  • 恕我直言,确实如此。 Jetpack ViewModel 处理配置更改。如果您使用SavedStateHandle,Jetpack ViewModel 也可以处理特定类型的进程终止场景(内存不足杀手)。这就对了。

标签: android android-jetpack android-viewmodel android-mvvm


【解决方案1】:

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

ComponentActivity 是 Fragment 和 AppCompatActivity 的父类。
每次进行生命周期回调时都会触发它,并且如果它的 onDestroy() 回调并且如果它不是配置更改,那么它将清除 viewModelStore。

           if (!isChangingConfigurations()) {
             getViewModelStore().clear();
           }

所以决定参数是isChangingConfigurations()

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多