问题描述
使用全局 LoadingDialog DialogFragment 弹框,或者 通用 DialogFragment 弹框时候,有时需要延时或者等接口回调后 dismiss 弹框,如果调用 此时 activity 退到后台, 则抛出异常
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
问题分析
Activity 退到后台,dialogFragment 所依赖的 Fragment / FragmentActivity, 在 onSaveInstance 之后,会调用 dialogFragment 的 saveAllState ,使得 fragmennt 的成员变量 mStateSaved = true. 在这之后 dialogFragment 的 FragmentTransaction 执行了commit() ,而 commit 操作过程中会进行 checkStateLoss() 校验,如果 mStateSaved || mStopped 为 true, 就会抛出异常
throw new IllegalStateException(
"Can not perform this action after onSaveInstanceState")
解决方案
在 dialogFragment dismiss() 时候 判断 所属 FragmentManager 的 isStateSaved 是否为 true。
fun dismiss() {
if (fragmentManager.isStateSaved) {
return
}
loadingDialog.dismiss()
}
参考资料:
完美解决DialogFragment Can not perform this action after onSaveInstanceState 问题