【发布时间】: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() 中获取的>。我将该更改应用于我的代码,并且我的应用程序不再因上述堆栈跟踪而崩溃。
问题:
-
在 Fragment 的 onCreate() 中获取 ViewModel 是否有任何特殊原因可能导致应用程序崩溃,如果是这样,那么为什么在 onViewCreated() 中获取 ViewModel > 似乎解决了这个问题?
-
我们是否应该总是在 onViewCreated() 中的 Fragment 中获取 ViewModel,而不是在 onCreate() 中,如官方文档的代码 sn-ps 所示?
【问题讨论】:
-
是的,使用
onViewCreated,因为onCreate可能并不总是被调用,并且在这些情况下引用将被初始化。
标签: java android android-fragments mvvm viewmodel