java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

1、棧頂原因分析:

FragmentManager.checkStateLoss這里拋的異常,翻下源碼會發(fā)現(xiàn):如果FragmentTransaction.commit時候activity的狀態(tài)被保存(即調(diào)用了onsaveInstance回調(diào)后),就會在這個地方拋這樣的異常;

2、相關(guān)知識點:

a、在android HONEYCOMB(Api11)之前:onsaveinstance回調(diào)是在onpause之前,在Api11之后調(diào)整到了opause之后onstop之前;

b、從報錯信息棧里可以看出我這個項目里用了:FragmentTabHost控件,F(xiàn)ragmentTabHost在調(diào)用addTab時候會調(diào)事務(wù)的commit;

c、FragmentTransaction.commit接口是不允許在activity的狀態(tài)保存之后調(diào)用(即調(diào)用了onsaveInstance回調(diào)后)

3、解決方案:

a、由于v4支持包中FragmentActivity的onsaveInstance回調(diào)存在bug,在回調(diào)這個方法時候有可能會有異常,這里重寫這個方法不去調(diào)用super:

 @Override
    protected void onSaveInstanceState(Bundle outState) {
//        super.onSaveInstanceState(outState);
        //No call for super(). Bug on API Level > 11.
    }

b、使用FragmentTransaction.commitAllowingStateLoss來提交事務(wù),但由于我這里提交事務(wù)是在源碼里的,無法復(fù)寫,故沒法處理了;

c、通過復(fù)寫FragmentTabHost的onAttachedToWindow方法捕獲異常:

 @Override
    protected void onAttachedToWindow() {
        try {
            super.onAttachedToWindow();
        } catch (IllegalStateException e) {
            //由于ft.commit();
        }
    }

自己在項目采用的方式是:將onSaveInstanceState()中的super.onSaveInstanceState(outState)注釋即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容