返回

#揭秘ViewModel实例的生命周期,告别错误认知!#

Android

揭秘 ViewModel 实例的生命周期,告别错误认知!

ViewModel 的生命周期与 Activity 和 Fragment

ViewModel 的生命周期独立于 Activity 和 Fragment,这意味着它不会随着它们的销毁而被销毁。这是因为 ViewModel 用于管理 UI 数据的变化,不属于特定的 Activity 或 Fragment,而是属于整个应用程序。因此,ViewModel 的生命周期比 Activity 和 Fragment 更长。

ViewModel 的创建

ViewModel 实例是在 Activity 或 Fragment 的 onCreate() 方法中创建的。以下是代码示例:

ViewModelProvider.Factory factory = new ViewModelProvider.NewInstanceFactory();
ViewModel viewModel = ViewModelProviders.of(this, factory).get(ViewModel.class);

在代码中,我们创建了一个 ViewModelProvider.Factory 实例,然后使用 ViewModelProviders.of() 方法创建一个 ViewModel 实例。ViewModelProvider.Factory 用于创建 ViewModel 实例,我们可以自定义工厂来创建不同的 ViewModel 实例。

ViewModel 的销毁

ViewModel 实例会在 Activity 或 Fragment 的 onDestroy() 方法中被销毁。以下是代码示例:

@Override
protected void onDestroy() {
    super.onDestroy();
    ViewModelProviders.of(this).clear();
}

在代码中,我们使用 ViewModelProviders.of() 方法清除 ViewModel 实例。需要注意的是,ViewModelProviders.of() 方法只能清除当前 Activity 或 Fragment 的 ViewModel 实例,不会清除其他 Activity 或 Fragment 的 ViewModel 实例。

ViewModel 实例的回收时机

ViewModel 实例会在以下两种情况下被回收:

  1. 当 Activity 或 Fragment 被销毁时,ViewModel 实例会被销毁。
  2. 当使用 ViewModelProviders.of() 方法清除 ViewModel 实例时,ViewModel 实例会被销毁。

常见问题解答

  • Q:ViewModel 的生命周期比 Activity 和 Fragment 更长,这有什么好处?

    • A:这使得 ViewModel 能够跨 Activity 和 Fragment 存储和共享数据,避免数据丢失。
  • Q:我应该在哪里创建 ViewModel 实例?

    • A:通常在 Activity 或 Fragment 的 onCreate() 方法中创建。
  • Q:我应该在哪里销毁 ViewModel 实例?

    • A:通常在 Activity 或 Fragment 的 onDestroy() 方法中销毁。
  • Q:我可以在 Activity 或 Fragment 中多次创建同一个 ViewModel 实例吗?

    • A:不建议这样做,因为这可能会导致数据混淆。
  • Q:如何使用自定义工厂创建 ViewModel 实例?

    • A:通过实现 ViewModelProvider.Factory 接口并覆盖 create() 方法来创建自定义工厂。