java.lang.IllegalStateException
commit引起的
java.lang.IllegalStateException
Can not perform this action after onSaveInstanceState
android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1448)
android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1466)
android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)
android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
......
这个异常是由于执行commit fragment的时候,onSaveInstanceState已经在这之前被调用了。从调用堆栈可以看出异常是在checkStateLoss中抛出的
private void checkStateLoss() {
if (mStateSaved) {
throw new IllegalStateException(
"Can not perform this action after onSaveInstanceState");
}
if (mNoTransactionsBecause != null) {
throw new IllegalStateException(
"Can not perform this action inside of " + mNoTransactionsBecause);
}
}
要抛出IllegalStateException 那么显然mStateSaved为true,而mStateSavad是在onSaveInstanceState的时候被设置为true。
解决方案
commit替换为commitAllowingStateLoss
commitAllowingStateLoss里面不会调用checkStateLoss 所以不会抛出异常
onBackPressed引起的
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyUp(Activity.java:2044)
at android.view.KeyEvent.dispatch(KeyEvent.java:2529)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
......
同上的原因一样都是由checkStateLoss中抛出的异常
解决方案
override onBackPressed不调用super.onBackPressed, 自己调用finish销毁activity
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}