处理和缓解非法状态异常(“故障保存状态:活动$Fragment已清除索引:-1”)

2022-09-03 07:36:07

我的 Android 应用程序管理多个片段。但是,我在字段中看到大量崩溃,其中包含以下日志行:

java.lang.IllegalStateException: Failure saving state: active xxxFragment{81e598 id=0x7f0b0069 tag_yyy} 已清除索引: -1

在Stack Overflow中搜索答案是徒劳的;我似乎有很多公司想知道这个例外到底意味着什么。深入研究异常跟踪和Android源,我可以看到异常来自我的主要活动保存其状态(FragmentActivity.onSaveInstanceState)的点,并且各个片段正在写入Mailable。每个片段都有一个索引(称为 mIndex),该索引必须是非负索引,但从代码中并不清楚为什么必须如此,因为 mIndex 永远不会在该函数中再次使用。

我不知道碎片是如何进入这种状态的,也不知道我能做些什么。我无法在自己的测试环境中重现该错误。任何人都可以说明如何避免和/或处理这种例外吗?

相关的 SO 问题:

java.lang.IllegalStateException: Failure Saving State: active 已清除片段中的索引

活动片段已清除索引:-1 是什么意思,我该如何修复它?

获取异常作为失败保存状态:活动片段已清除索引:-1当我按下Android设备的主页按钮时

非法状态与Android Fragments的异常


答案 1

我将编辑我之前的评论,并使其成为实际的答案。 是一条红鲱鱼。至少在我的情况下。从这里开始: http://www.localwisdom.com/blog/2013/03/android-error-java-lang-illegalstateexception-failure-saving-state-active-fragmentname/setRetainInstance(true)

“您很可能尝试执行片段事务,其中没有对片段的正确实例的引用”

当我读到这一切对我来说都有意义时。我用碎片做了2件错误的事情。

  1. 我令人反感的片段是单例。(主要禁忌)
  2. 我试图在没有正确保存状态的情况下跨活动使用这些相同的片段实例。(这可以通过这里提到的方法实现:https://stackoverflow.com/a/12465343/333525)

(希望这有帮助。它太长了,不能只是一个评论。


答案 2

在我的情况下,我忘记在分离和附加之前检查是否被添加:fragment

if (fragment != null && fragment.isAdded()) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .detach(fragment)
                    .attach(fragment)
                    .commit();
        }

推荐