首页 > 解决方案 > 在 onViewCreated 与 onCreate 中的 Fragment 中获取 ViewModel

问题描述

我有一个带有 Fragment 的 Android Activity,我们将其命名为MyFragment

在 MyFragment 的onCreate()中,我的 ViewModel 如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    myViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
}

问题:

有时,当我将应用程序置于后台并导航到其他应用程序时,当我尝试打开并将此应用程序带回前台时,应用程序会因以下错误而崩溃:

Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.MyViewModel
    ...
    at com.example.MyFragment.onCreate(MyFragment.java:64)

其中第 64 行是这一行:

myViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);

在查看ViewModel 的官方文档后,我注意到在代码片段中,在所有片段中,ViewModel 都是在onViewCreated()而不是onCreate()中获取的。我将该更改应用于我的代码,并且我的应用程序不再因上述堆栈跟踪而崩溃。

问题:

  1. 是否有任何特殊原因导致在 Fragment 的onCreate()中获取 ViewModel可能会导致应用程序崩溃,如果是这样,那么为什么在onViewCreated()上获取 ViewModel似乎可以解决此问题?

  2. 我们是否应该总是在onViewCreated()的 Fragment 中而不是onCreate()中获取 ViewModel,如官方文档的代码片段中所示?

标签: javaandroidandroid-fragmentsmvvmviewmodel

解决方案


这是由于 android 上存在的 Fragment Life-Cycle 造成的。您可以在这里阅读更多内容 https://developer.android.com/guide/fragments/lifecycle

所以基本上,只有在第一次创建片段时才会调用 onCreate。当您进入后台并再次恢复应用程序时,不会调用 onCreate() 函数,而是调用 onCreateView() 或 onViewCreated ()。参考下图。因此,当您在 OnCreate() 中初始化 viewModel 并将应用程序置于后台并返回应用程序时,因为没有调用 OnCreate(),因此不会创建 viewModel 并因此崩溃。而在 OnViewCreated() 中,viewModel 会在应用程序从后台返回时初始化,因此不会发生崩溃。所以,是的,应该在 onViewCreate() 中对其进行初始化。

在此处输入图像描述


推荐阅读