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