这个错误是我非常大的问题,我读了越来越多的解决方案,但是我无法解决这个问题,我在活动上有一些片段,我用这段代码替换片段:
if (mSelectedMenuItem != 2) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
transaction.replace(R.id.menu_containers, fragment);
transaction.commit();
}
}, duration);
}
错误:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
和我的onSaveInstanceState
:
@Override
protected void onSaveInstanceState(Bundle outState) {
// Bug in android version > 11
//super.onSaveInstanceState(outState);
outState.putInt("selectedMenuItem", selectedMenuItem);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
selectedMenuItem = savedInstanceState.getInt("selectedMenuItem");
}
答案 0 :(得分:1)
您在使用postDelayed()
时遇到问题。应用程序可能会在执行之前被杀死:
new Handler().postDelayed(new Runnable() {
使用可以使用commitAllowingStateLoss()
(以避免IllegalStateException错误),但仅作为最后的手段。调用commit()
和commitAllowingStateLoss()
之间的唯一区别是,如果发生状态丢失,后者不会抛出异常。通常您不想使用此方法,因为它意味着可能会发生状态丢失。当然,更好的解决方案是编写应用程序,以便在保存活动状态之前保证调用commit()
,因为这将带来更好的用户体验。除非无法避免国家损失的可能性,否则不应使用commitAllowingStateLoss()
。