对话框片段已添加异常未抛出

Posted

技术标签:

【中文标题】对话框片段已添加异常未抛出【英文标题】:Dialog Fragment already added exception no thrown 【发布时间】:2019-01-07 19:51:38 【问题描述】:

在我的应用中,我使用 DialogFragments。

有时候,我会越来越

Fragment 已添加 IllegalStateException

应用程序崩溃。这些崩溃出现在 crashlytics 上。

在第一个实例关闭之前尝试两次显示相同的对话框片段时,似乎会发生此问题。

这个问题已经讨论过很多次了,比如here 或here,但问题是,它并不是在所有设备上都保持不变。

我无法在我的办公桌上重现此问题。 即使我尝试两次显示相同的对话框,我也没有收到此异常。

我什至使用fragment.isAdded() 来确保显示它,然后再次显示它。当然只是为了捕捉错误。但没有成功。

有什么想法吗? 我可以在显示对话框之前添加fragment.isAdded() 条件以防止这种情况发生,但我想了解其根本原因。我担心我无法重现这一点。

这是我显示对话框的部分代码: MyDialog 扩展 DialogFragment

 MyDialog dialog = (MyDialog) getSupportFragmentManager().findFragmentByTag(MyDialog.TAG);

    if(dialog == null)  //create and show the dialog
        dialog = new MyDialog();
        dialog.setCancelable(false);
    
        dialog.show(getSupportFragmentManager(), MyDialog.TAG);

【问题讨论】:

请分享代码 要重现这一点,您可以尝试多次按下DialogFragments 启动器按钮。 【参考方案1】:

我想我找到了问题所在。

首先,在这里使用dialog.isAdded() 有所帮助.. 但这里的问题与应用程序的instanceState 有关。

正如我所说,此错误并非发生在所有设备或用户上,因此很难发现。

首先,我的应用配置为仅纵向。 当对话框打开时,如果用户由于某种原因(例如电话或其他应用程序)导航到其他应用程序,这反过来会导致我的应用程序进入 onStop 以及导致配置更改的其他应用程序。

例如,当对话框打开时,按主页按钮并转到手机设置并更改语言,这将导致配置更改,并且在导航返回时将重新创建应用程序。

当用户导航回我的应用程序时,它被系统杀死并尝试重新创建堆栈并且 onSaveInstanceState 不为空,对话框已经在堆栈中,我的应用程序尝试再次显示它。

这会杀死应用程序。

【讨论】:

当时你是如何解决这个问题的?

以上是关于对话框片段已添加异常未抛出的主要内容,如果未能解决你的问题,请参考以下文章

赋值操作期间未抛出空指针异常

捕获程序未抛出的异常

自定义对话框片段

关闭从另一个对话框片段启动的对话框片段会导致非法状态异常

WIN32对话框抛出异常[重复]

当我不知道它可能会抛出哪里时,如何记录异常?