Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Can not perform this action after onSaveInstanceState

Tags:

android

I'm still apparently not clear on handling fragments along with other things going on in my activity. The following is the stack trace:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { (has extras) }} to activity {com.ghcssoftware.gedstar/com.ghcssoftware.gedstar.GedStar}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.ActivityThread.deliverResults(ActivityThread.java:2747)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:2790)
at android.app.ActivityThread.access$2000(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1035)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4028)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
**at android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:471)
at com.ghcssoftware.gedstar.PersonTab$PersonTabFrag.popStack(PersonTab.java:157)**
at com.ghcssoftware.gedstar.PersonTab$PersonTabFrag.fillData(PersonTab.java:165)
at com.ghcssoftware.gedstar.ViewTab.fillData(ViewTab.java:96)
at com.ghcssoftware.gedstar.GedStar.fillData(GedStar.java:589)
at com.ghcssoftware.gedstar.GedStar.onActivityResult(GedStar.java:514)
at android.app.Activity.dispatchActivityResult(Activity.java:4541)
at android.app.ActivityThread.deliverResults(ActivityThread.java:2743)

So this looks like it is my call to popBackStack within this function where I'm cleaning out any stacked fragments in one of my view panes:

    // Pop fragments from second pane
    private void popStack() {
        if (mDualPane && mBottomId >= 0) {
            mViewTab.getTabHelper().tabGetFragManager().popBackStack(mBottomId, 
                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
            mBottomId = -1;
        }
    }

Mainly I'm not sure why any of this is occurring "after onSaveInstanceState" has been called, or if that's what's really happening. Any possible explanations? Would popBackStackImmediate make a difference?

For what it's worth, I have not been able to recreate the circumstances in my testing, so it's only showing up in the reports.

like image 513
gordonwd Avatar asked Jan 05 '12 23:01

gordonwd


People also ask

Can not perform this action after Onsaveinstancestate onBackPressed?

You can't call onBackPressed() when your activity is paused. However, the behavior on a back press is to leave the activity. Just call finish() instead of onBackPressed() . You should make sure in your onBackPressed() 's override that the activity is going to finish.

What is commitAllowingStateLoss?

commitAllowingStateLoss():If the commit is attempted after that point, an exception will be thrown. This is because the state after the commit can be lost if the activity needs to be restored from its state.


1 Answers

The problem, which is evident from looking at the trace, is that I was calling popStack from code in my onActivityResult method, which is called before onResume. I moved the call to onResume and fixed it.

like image 135
Bill the Lizard Avatar answered Nov 12 '22 13:11

Bill the Lizard