在 onViewCreated 和 onCreate 中获取 Fragment 中的 ViewModel

Tha*_*s M 1 java android mvvm viewmodel android-fragments

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

在 MyFragment 的onCreate() 中,我的 ViewModel 是这样的:

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

    myViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
}
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

其中第 64 行是这个:

myViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)

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

问题:

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

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

Kar*_*kar 6

这是由于 android 上存在的 Fragment Life-Cycle。您可以在https://developer.android.com/guide/fragments/lifecycle了解更多相关信息 。

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

在此处输入图片说明