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)注釋即可。