天天看点

Fragment坑之Can not perform this action after onSaveInstanceState

该情况一般发生在当前Activity等,系统会调用onSaveInstanceState()帮你保存当前Activity的状态、数据等,直到再回到该Activity之前(onResume()之前),你执行Fragment事务,就会抛出该异常!(一般是其他Activity的回调让当前页面执行事务的情况,会引发该问题)。曾在项目管理我的应用栏,三个按钮控制我的,更新,卸载栏,分别跳转不同fragment鬼畜发生过。当时暴力try-catch解决。。试过网路上所说的commitAllowingStateLoss()方法提交,但是会产生新的问题

后面查到一种新的方法:在重新回到该Activity的时候(onResumeFragments()或onPostResume()),再执行该事务,配合数据保存,可以做到事务的完整性,不会丢失事务。

代码如下

@Override
    // 如果是在Fragment内, 则复写onResumeFragments()改为onResume()即可
    protected void onResumeFragments() {
        super.onResumeFragments();
        mIsSaved = true;
        if (mTransactionEvent != null) {
            // 这里执行事务
            mTransactionEvent = null;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mIsSaved = false;
    }

    @Subscribe(sticky = true) // sticky事件可以保证即使Activity被强杀,也会在恢复后拿到数据
    public void onEvent(TransactionEvent event) {
        if (mIsSaved) {
            // 这里执行事务
        } else {
            mTransactionEvent = event;
        }
    }
           

(ps: 以EventBus通知执行事务为例)