1、棧頂原因分析:
FragmentManager.checkStateLoss這里拋的異常,翻下源碼會發現:如果FragmentTransaction.commit時候activity的狀態被保存(即調用了onsaveInstance回調后),就會在這個地方拋這樣的異常;
2、相關知識點:
a、在android HONEYCOMB(Api11)之前:onsaveinstance回調是在onpause之前,在Api11之后調整到了opause之后onstop之前;
b、從報錯信息棧里可以看出我這個項目里用了:FragmentTabHost控件,FragmentTabHost在調用addTab時候會調事務的commit;
c、FragmentTransaction.commit接口是不允許在activity的狀態保存之后調用(即調用了onsaveInstance回調后)
3、解決方案:
a、由于v4支持包中FragmentActivity的onsaveInstance回調存在bug,在回調這個方法時候有可能會有異常,這里重寫這個方法不去調用super:
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
//No call for super(). Bug on API Level > 11.
}
b、使用FragmentTransaction.commitAllowingStateLoss來提交事務,但由于我這里提交事務是在源碼里的,無法復寫,故沒法處理了;
c、通過復寫FragmentTabHost的onAttachedToWindow方法捕獲異常:
@Override
protected void onAttachedToWindow() {
try {
super.onAttachedToWindow();
} catch (IllegalStateException e) {
//由于ft.commit();
}
}
自己在項目采用的方式是:將onSaveInstanceState()中的super.onSaveInstanceState(outState)注釋即可。