Android无法在onSaveInstanceState之后执行此操作

时间:2016-12-06 06:53:22

标签: android

这个错误是我非常大的问题,我读了越来越多的解决方案,但是我无法解决这个问题,我在活动上有一些片段,我用这段代码替换片段:

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");
}

1 个答案:

答案 0 :(得分:1)

您在使用postDelayed()时遇到问题。应用程序可能会在执行之前被杀死:

new Handler().postDelayed(new Runnable() {

使用可以使用commitAllowingStateLoss()(以避免IllegalStateException错误),但仅作为最后的手段。调用commit()commitAllowingStateLoss()之间的唯一区别是,如果发生状态丢失,后者不会抛出异常。通常您不想使用此方法,因为它意味着可能会发生状态丢失。当然,更好的解决方案是编写应用程序,以便在保存活动状态之前保证调用commit(),因为这将带来更好的用户体验。除非无法避免国家损失的可能性,否则不应使用commitAllowingStateLoss()