java - 在 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()中获取的。我将该更改应用于我的代码,并且我的应用程序不再因上述堆栈跟踪而崩溃。
问题:
是否有任何特殊原因导致在 Fragment 的onCreate()中获取 ViewModel可能会导致应用程序崩溃,如果是这样,那么为什么在onViewCreated()上获取 ViewModel似乎可以解决此问题?
我们是否应该总是在onViewCreated()的 Fragment 中而不是onCreate()中获取 ViewModel,如官方文档的代码片段中所示?
解决方案
这是由于 android 上存在的 Fragment Life-Cycle 造成的。您可以在这里阅读更多内容 https://developer.android.com/guide/fragments/lifecycle。
所以基本上,只有在第一次创建片段时才会调用 onCreate。当您进入后台并再次恢复应用程序时,不会调用 onCreate() 函数,而是调用 onCreateView() 或 onViewCreated ()。参考下图。因此,当您在 OnCreate() 中初始化 viewModel 并将应用程序置于后台并返回应用程序时,因为没有调用 OnCreate(),因此不会创建 viewModel 并因此崩溃。而在 OnViewCreated() 中,viewModel 会在应用程序从后台返回时初始化,因此不会发生崩溃。所以,是的,应该在 onViewCreate() 中对其进行初始化。
推荐阅读
- angular - 自定义标题 Ag-Grid 中的排序数字?
- javascript - JavaScript RegEx 用于匹配长度在 1 到 5 个字符之间且不应以空格开头和结尾的字符串
- angular - 错误:角度 4 或角度 6 中的 StaticInjectorError(AppModule)
- javascript - 安装屏幕阅读器
- php - 在 php 中使用 ssh 连接到远程服务器
- javascript - 如何在节点js中的foreach之后发送respose?
- html - 使用 XML 显示图像列表
- laravel - 在 lumen 中,如何在 trait 中调用另一个 trait 的函数
- angular - 将用户对象存储在 localstroage 中是否合适?
- asp.net - Telerik Kendo MVC 调度程序 - 无法移动事件