android - 由于打开的对话框,应用程序在初始化期间崩溃
问题描述
这个崩溃已经在我的开发者控制台中出现了很长时间,我无法以任何方式重现它。
我有一个以 MainActivity 开头的应用程序。在 onCreate 中,一些数据是从后端异步下载的。在此活动中按下按钮时,将打开一个对话框,其中显示从服务器下载的一些数据。
这是崩溃:
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.******.******/com.******.******.MainActivity}: com.******.******.users.UserData$DataNotFoundException: Requested element not found
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6942)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by com.******.******.users.UserData$DataNotFoundException: Requested element not found
at com.******.******.users.UserData.getData(UserData.java:478)
at com.******.******.UserDialog.onCreateDialog(UserDialog.java:87)
at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:380)
at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1412)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1341)
at android.app.Activity.performStart(Activity.java:7200)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6942)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
令我困惑的是,由于对话框膨胀时发生崩溃,因此在 performLaunchActivity 中发生了崩溃。但是,该对话框不是在 Activity 的 onCreate 中创建的,而是在用户按下按钮后创建的。然而,该按钮没有被点击(我在点击监听器中添加了一个日志,它从未被调用)。
我在 GitHub 问题跟踪器中看到过类似模式的崩溃,但没有回复,所以这似乎是一种常见的模式,但很难调试。
问题是在什么情况下可以从 performLaunchActivity 实例化 Dialog,即使 onCreate() 方法中没有对对话框的引用。我猜它与活动的生命周期有关,但我无法破解它。
解决方案
您的崩溃可能发生在屏幕旋转时,或者在后台进程死亡后恢复应用程序。在这种情况下,它DialogFragment
是在没有用户交互的情况下创建的。您是否检查并推理了这些情况?
根据文档打开对话框时,您可能希望将数据作为参数传递。这样,系统将重新创建数据完整的对话框。
推荐阅读
- reactjs - jsPDF addImage 输出灰色方块
- ofbiz - 使用 OFBIZ 中的图表从 Birt 报告生成 PDF
- ignite - 点燃瘦客户端 - 仅从扫描查询中获取键而不是值
- c# - 添加对何时为特定对象添加数据的限制
- docker - 无法访问 docker 容器 alpine 基础映像上的网页
- jobs - 在 Azure Databricks 环境中初始化集群需要更长的时间并且有时会引发错误
- solana - Solana 链上查询
- html - 仅单击一个子菜单时如何防止引导程序折叠所有子菜单?
- python - 如何根据列名合并数据框?
- azure-api-management - Azure APIM 部署失败。“代码”:“资源部署失败”