java.lang.IllegalStateException(onSaveInstanceState 后无法执行此操作)

Posted

技术标签:

【中文标题】java.lang.IllegalStateException(onSaveInstanceState 后无法执行此操作)【英文标题】:java.lang.IllegalStateException(Can not perform this action after onSaveInstanceState) 【发布时间】:2014-10-18 15:32:33 【问题描述】:

我在不同情况下收到此错误并显示以下消息:

Activity 已被销毁并且 onSaveInstanceState 后无法执行此操作

我正在编写一个应用程序,其中两个 Activity 相互交互。 Activity-A 使用 Intent 启动 Activity-B。这个 Activity-B 类有两个片段子级。 Fragment-A 使用公共活动方法来启动另一个 Fragment-B

public void beginTransaction(ID id, Bundle bundle) 

        Fragment fragment = getFragmentItem(id);

        // In case this activity was started with special instructions from an Intent,
        // pass the Intent's extras to the fragment as arguments
        fragment.setArguments(bundle);

        // Add the fragment to the 'fragment_container' FrameLayout
        fragmentManager.beginTransaction()
        .add(R.id.fragment_container, fragment).commitAllowingStateLoss();
    

Fragment-B 每次调用 finish() 来杀死 Activity-B 从而控制再次回到 Activity-A。并重复相同的过程。做了 2-3 次后,我得到:

java.lang.IllegalStateException: 之后无法执行此操作 onSaveInstanceState E/AndroidRuntime(9008):android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1354) E/AndroidRuntime(9008):在 android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1372)

所以为了避免它,我关注https://***.com/a/10261438/2624806,它开始给我

Java.lang.IllegalStateException: Activity 已被销毁 E/AndroidRuntime(9235):在 android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1376) E/AndroidRuntime(9235):在 android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)

我在这里缺少的任何建议。

明白了我得到了解决方案..这是在添加片段的事务中发生的错误。我使用 .add 而不是使用 .replace (因为我要求不维护堆栈)并使用 commitAllowTransaction 来提交它。我也阅读了http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html,似乎我所做的可能代价高昂,但对于正常的片段事务,提及变通方法效果很好。

【问题讨论】:

commitAllowingStateLoss()commit() 如何从片段中调用完成?使用 getActivity().finish()? 什么时候调用beginTransaction(...)方法? Fragment Transactions & Activity State Loss "避免在异步回调方法中执行事务。" 谢谢,@Mdlc @ anderson_acs 我没有写明确的代码来完成 Fragment,Fragment 调用公共方法 beginTransaction() 来启动另一个 Fragment,它替换现有的 Fragment。任何建议! 由于要删除 Fragment-A 并添加 Fragment-B,因此需要使用 FragmentTransaction.replace 而不是 FragmentTransaction.add。尝试让我知道它是否有帮助。 【参考方案1】:

由于声誉点较低,我无法评论您的问题。 我认为这是您更改片段的公共方法。

public void beginTransaction(ID id, Bundle bundle)

每次您将片段添加到活动时,在此方法中。因此,如果您是第一次添加片段,这将正常工作,但在第二个片段的情况下,您应该使用替换而不是添加

    fragmentManager.beginTransaction()
    .replace(R.id.fragment_container, fragment).commitAllowingStateLoss();

我认为这样做后你不应该面对这个问题。或者您可以对第一个和第二个片段使用“替换”。 我希望这能帮到您。

【讨论】:

如果我的要求是我不能使用替换而不是添加,那么我该如何处理呢?

以上是关于java.lang.IllegalStateException(onSaveInstanceState 后无法执行此操作)的主要内容,如果未能解决你的问题,请参考以下文章