Fragment坑之Can not perform this action after onSaveInstanceState

来源:互联网 发布:java多线程售票系统 编辑:程序博客网 时间:2024/06/07 20:40

该情况一般发生在当前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通知执行事务为例

0 0
原创粉丝点击