該情況一般發生在目前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通知執行事務為例)