IllegalStateException - Fragment support library
Asked Answered
R

3

20

I have a serious problem with my App continously crashing on some users devices with the following exception in an Activity onStart 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.BackStackRecord.commitInternal(BackStackRecord.java:541)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123) 

I cannot reproduce this error locally in my emulator. I have found a few questions regarding this issue on stackoverflow: here and here

I have tried the suggested solution, i.e. do not allow empty bundles in onSaveInstance neither in fragments nor activities.

However the problem remains. This is the only Crash report I ever get, and I get it continously.

Does anyone have a working solution?

Rossetti answered 10/8, 2012 at 11:33 Comment(0)
R
8

I have solved this issue by

Check my answer here for code: "Can not perform this action after onSaveInstanceState" - why am I getting this exception from my activity's onResume method?

Got no more IllegalStateException so far.

Rossetti answered 13/8, 2012 at 9:40 Comment(0)
L
4

I solved this using this workaround, namely put the code into a methods onPostResume() function in the Activity

Leader answered 7/1, 2013 at 2:37 Comment(3)
down vote: onPostResume is not available for android.support.v4.app.FragmentPlatinum
@Platinum it is in android.support.v4.app.FragmentActivity, not the FragmentLooper
No because I am getting this exception when popping from the backstack in onPostResume, i.e. this isn't a fix.Damalus
F
-1

Read This Article.

And,

This one.

Once the issue is understood, go ahead and change things properly:

Figure out why your transactions are happening outside your onResume state. Why are these things happening when they shouldn't be. Why are you manually adding and removing fragments with regard to the lifecycle of you app rather than when the user requests. You should maybe need one time in the onCreate() or when the user invokes something. But why are you messing with them in onResume() in the first place? Don't do that.

If you change all the .commit() to .commitAllowStateLoss() then the crashes will go away. But, you're better off not doing that. You are better off making sure you never change your fragments except when the app is fully live. Sometimes that means never loading a fragment from the OnActivityResult() but rather flagging to run in your onPostResume(), and avoiding performing UI changes in async threads that wrongly assume you couldn't have killed the activity in the meantime.

If you just want to spackle everything, .commitAllowStateLoss() will do that. If you want to do it right, make sure you don't fiddle with your fragments after things die.

One of the more recent forms of Android circa Oreo I think, changed this to avoid this annoying error. My answer seems a bit vague but it's because the bug is in the paradigm. You entirely can hit that with various code elements and fairly routinely.

Frangipane answered 18/6, 2017 at 7:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.