Android commit 和 commitAllowingStateLoss 的区别

    fragment 基本上是每个项目都会用到,一般我们会这么写:

 getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.fragment_container, new MyFragment())
            .commit();

    但是有时候会报如下错误信息:

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

    意思就是说我们不能在调用onSaveInstanceState进行commit操作。网上的解决办法是使用commitAllowingStateLoss替换commit。确实是不报错了,但是为什么呢?commit是会对状态进行检测,并抛出异常;而commitAllowingStateLoss方法只是不进行状态检测,因此不会抛出异常。这明显是有点逃避问题,那么这个状态是什么判断而得出的呢?

     在ActivityFragmentActivity内的onSaveInstanceState方法保存了fragment的状态。在onSaveInstanceState方法后调用commitcommitAllowingStateLoss会引起一种问题:因内存不足而把不显示在前台的 activity (带有 fragment)销毁,之后用户再回到此 activity 页面时,是会丢失在onSaveInstanceState后调用commit方法提交的页面状态信息!
不同的只是调用commit会报错,调用commitAllowingStateLoss不报错(睁一只眼闭一只眼)。

    谷歌在commitAllowingStateLoss方法的注释上也写明,调用此方法会有丢失页面状态信息的风险。

  • 一般情况下,尽量提早调用 commit 方法,比如说onCreate()
  • 异步回调中避免使用commit
  • 不得已的情况,可以使用commitAllowingStateLoss替代commit。毕竟报错奔溃,比页面状态信息丢失更严重;



作者:chenxuxu
链接:
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值