首页 > 解决方案 > 由于打开的对话框,应用程序在初始化期间崩溃

问题描述

这个崩溃已经在我的开发者控制台中出现了很长时间,我无法以任何方式重现它。

我有一个以 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() 方法中没有对对话框的引用。我猜它与活动的生命周期有关,但我无法破解它。

标签: androidandroid-layoutandroid-activityandroid-lifecycleandroid-dialog

解决方案


您的崩溃可能发生在屏幕旋转时,或者在后台进程死亡后恢复应用程序。在这种情况下,它DialogFragment是在没有用户交互的情况下创建的。您是否检查并推理了这些情况?

根据文档打开对话框时,您可能希望将数据作为参数传递。这样,系统将重新创建数据完整的对话框。


推荐阅读