問題:
Fragment的時候會偶爾出現(xiàn)錯誤:
Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
在onSaveInstanceState行為之后,app執(zhí)行某個不能響應的行為而導致異常發(fā)生也殖。這里是指在執(zhí)行onSaveInstanceState之后再調(diào)用FragmentTransaction的commit方法導致異常的發(fā)生
WechatIMG3039.jpeg
解決方案:
使用commitAllowingStateLoss即可车猬。
下面從源碼角度分析一下為什么。
WechatIMG150.jpeg
WechatIMG151.jpeg
首先:commit()和commitAllowingStateLoss() 都存在于package android.support.v4.app
FragmentTransaction類中
DialogFragment 中沒有提供commitAllowingStateLoss(),只commit(),解決辦法就是重寫show方法 使用commitAllowingStateLoss()提交。
public void show(FragmentManager manager, String tag) {
this.mDismissed = false;
this.mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
}
try {
var mDismissed: Field = DialogFragment::class.java.getDeclaredField("mDismissed")
mDismissed.isAccessible = true
mDismissed.set(this, false)
var mShownByMe: Field = DialogFragment::class.java.getDeclaredField("mShownByMe")
mShownByMe.isAccessible = true
mShownByMe.set(this, true)
} catch (e: Exception) {
e.printStackTrace()
}
val ft: FragmentTransaction = manager.beginTransaction()
ft.add(this, tag)
ft.commitAllowingStateLoss()
修改:try catch 中 反射修改 private 字段 mShownByMe,mDismissed 之前獲取異常 走到catch 未注意 已修改!