FragmentManager 出现 IllegalStateException

12

我的应用程序在许多Android平台(4.1、4.0.4、2.3.6等)上不断报告此问题。 但我无法在我的手机上重现此问题。 我通过Google搜索了这个问题,但堆栈跟踪似乎与我的不同。

有人知道这个问题是如何发生的吗?以及如何防止它? 或者如何重现此错误? 谢谢。

堆栈跟踪:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:278)
at android.view.View.dispatchAttachedToWindow(View.java:12064)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2707)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1339)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1131)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4611)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
at dalvik.system.NativeStart.main(Native Method)

--------------------编辑--------------------

给Jonathan:

我有两个片段。只有一个片段覆盖了onPause回调函数,代码如下。在onPause之后,我没有覆盖其他的回调函数。另一个我覆盖的回调函数是onResume回调函数,代码也是下面这样。

片段:

@Override
public void onPause() {
    super.onPause();
    if (mView instanceof MyView) {
        MyView my = (MyView) mView;
        my.onPause();
    }
}

@Override
public void onResume() {
    super.onResume();
    if (mView instanceof MyView) {
        MyView my = (MyView) mView;
        my.onResume();
    }
}

MyView:

public void onPause() {
    pause = true;
}

public void onResume() {
    pause = false;
    if (mDialog != null && mDialog.isShowing()) {
        mDialog.dismiss();
        mDialog = null;
    }
}

我也追踪了FragmentActivity/FragmentManager的代码,似乎如果在调用onPostResume()之前调用onAttachedToWindow(),那么问题就会发生。

是否有可能在调用onPostResume()之前调用onAttachedToWindow()


很可能是由屏幕旋转和onSaveInstanceState引起的问题。请检查FragmentTabHost.onAttachedToWindow行:278。如果您可以提供FragmentTabHost的代码,那就更好了。 - LuckyMe
1
@LuckyMe FragmentTabHost是Android源代码的一部分,不是这个用户实现的。 - Jonathan
大家好,我已经更新了一些注释。感谢你们的帮助。 - user2581991
好的,关于你具体情况我无法给出答案,但今天我刚遇到了这个错误。在我的情况下,基本上是我发出一个请求,注册回调,然后在请求完成之前离开了片段。这导致回调在引用不再有效的情况下被调用,显示了与你看到的类似的异常。为了调试,我建议检查一下是否有任何东西会在你的片段被销毁后进行调用。 - Jonathan
我有一个后台线程,在线程完成其工作后,它会发送消息以弹出对话框。也许这会引起问题? - user2581991
显示剩余2条评论
1个回答

15

这个问题是由于在Activity暂停后提交片段引起的。

一个简单的解决方法是使用FragmentTransaction.commitAllowingStateLoss()而不是FragmentTransaction.commit()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接