Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Can not perform this action after onSaveInstanceState" - why am I getting this exception from my activity's onResume method?

My activity invokes the camera with the ACTION_IMAGE_CAPTURE intent. If the camera activity returns succesfully, I set a flag in the onActivityResult callback, and based on the value of the flag I start a fragment in my onResume to add a caption to the image that was captured. This seems to work ok.

I just got a stack trace from the "wild" complaining that I was trying to commit a fragment transaction after onSaveInstanceState has been called. But I'm doing the commit in my onResume method! Why would android complain about this? I do have android:configChanges="orientation|keyboardHidden|keyboard|screenSize" set in my AndroidManifest.xml, so an orientation change should not trigger this....

This occurred on a Samsung Galaxy S3 (SGH-i747) running 4.0.4

Here is the stack:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState     at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314)     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325)     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)     at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)     at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.performFragmentTransition(AddPhotosActivity2.java:278)     at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.switchToCaptionsFragment(AddPhotosActivity2.java:438)     at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.onResume(AddPhotosActivity2.java:167)     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1158)     at android.app.Activity.performResume(Activity.java:4544)     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2448)     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486)     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1187)     at android.os.Handler.dispatchMessage(Handler.java:99)     at android.os.Looper.loop(Looper.java:137)     at android.app.ActivityThread.main(ActivityThread.java:4514)     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:980)     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)     at dalvik.system.NativeStart.main(Native Method) 

Any help or wisdom is appreciated.

like image 425
PacificSky Avatar asked Sep 16 '12 19:09

PacificSky


People also ask

How do you reproduce can not perform this action after onSaveInstanceState?

Short And working Solution :Step 1 : Override onSaveInstanceState state in respective fragment. And remove super method from it. Step 2 : Use fragmentTransaction. commitAllowingStateLoss( );

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. See commitAllowingStateLoss() for situations where it may be okay to lose the commit.


1 Answers

I think I know the answer - I'm using the FragmentActivity from v4 compatibility library, and so I need to perform my fragment transactions in onResumeFragments instead of in onResume. Can someone confirm?

like image 150
PacificSky Avatar answered Sep 28 '22 01:09

PacificSky