【问题标题】:Get ViewModel in Fragment in onViewCreated vs in onCreate在 onViewCreated 与 onCreate 中的 Fragment 中获取 ViewModel
【发布时间】:2021-08-09 09:26:38
【问题描述】:

我有一个带有 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's official documentation 之后,我注意到在代码 sn-ps 中,在所有 Fragments 中,ViewModel 是在 onViewCreated() 而不是 onCreate() 中获取的>。我将该更改应用于我的代码,并且我的应用程序不再因上述堆栈跟踪而崩溃。

问题:

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

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

【问题讨论】:

  • 是的,使用onViewCreated,因为onCreate 可能并不总是被调用,并且在这些情况下引用将被初始化。

标签: java android android-fragments mvvm viewmodel


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多