关于java:处理和缓解IllegalStateException(“故障保存状态:active $ Fragment已清除索引:-1”)

Handling and Mitigating IllegalStateException (“failure saving state: active $Fragment has cleared index: -1”)

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

java.lang.IllegalStateException: Failure saving state: active XxxFragment{81e598 id=0x7f0b0069 tag_yyy} has cleared index: -1

在堆栈溢出中搜索答案是徒劳的;我似乎有很多公司在想这个异常究竟意味着什么。深入到异常跟踪和android源中,我可以看到异常来自我的主要活动保存其状态的点(fragmentactivity.onsaveInstanceState),并且单个片段被写入一个parcelable。每个片段都有一个索引(称为mindex),该索引必须是非负的,但代码中并不清楚为什么一定是这样,因为mindex在该函数中不再使用。

我不知道片段是如何进入这种状态的,也不知道我能做些什么。我无法在自己的测试环境中重现错误。有人能解释一下如何避免和/或处理这个例外吗?

相关销售代表问题:

java.lang.illegalStateException:保存失败状态:active已清除片段中的索引

活动片段清除了索引是什么?-1的意思是什么?如何修复它?

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

Android碎片的非法状态例外


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

"您很可能试图执行片段事务,但您没有对片段的正确实例的引用。"

当我读到这些对我来说都是有意义的。我用碎片做了两件错事。

  • 我那令人讨厌的碎片是单件的。(少校不不)
  • 我试图在没有正确保存状态的情况下跨活动使用这些相同的片段实例。(可通过以下方法实现:https://stackoverflow.com/a/12465343/333525)
  • (希望这有帮助。太长了,无法发表评论。)


    在我的例子中,我忘记检查在拆卸和连接之前是否添加了fragment

    1
    2
    3
    4
    5
    6
    7
    if (fragment != null && fragment.isAdded()) {
                getSupportFragmentManager()
                        .beginTransaction()
                        .detach(fragment)
                        .attach(fragment)
                        .commit();
            }