完全解析Android IllegalStateException("Can not perform this action after onSaveInstanceState")

这个异常可能在多种情况下抛出。

一、commit()

最典型的是使用commit()方法会遇到该异常,我们先看下图具体实现源码:


可以看到,如果allowStateLoss为false,则检测状态丢失,此时如果mStateSaved为true,就会抛出异常。所以当我们调用commitAllowingStateLoss()方法,则传入的allowStateLoss值为真,就不会调用checkStateLoss()方法,也就不会抛出异常了。


二、stop()后的checkStateLoss()抛出异常

你可能已经发现mStateSaved状态是抛出异常的关键,只有其为真,那么调用checkStateLoss()必定抛出异常。那么什么时候mStateSaved被置为真的呢?我们看下源码:



可以看到当Fragment进入stop状态时,mStateSaved为真。此时如果执行退出方法onBackPressed()则必定抛出异常。我们看下FragmentActivity的onBackPressed()方法逻辑:



可见,在popBackStackImmediate()方法中首先进行了状态丢失检测,如果mStateSaved为真则必定抛出此异常。

我们对FragmentActivity的onBackPressed()要进行状态丢失检测可能是出于状态完整性考虑,但为避免异常,可覆盖onBackPressed()方法,直接finish()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值