天天看點

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通知執行事務為例)