fragment/dialogfragment异常:Can not perform this action after onSaveInstanceState

3 篇文章 0 订阅
1 篇文章 0 订阅

项目在测试的时候未出现崩溃,但是上线之后奔溃日志中发现有相当数量的报错信息如下:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1538)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1556)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:696)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:662)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:143)
at com.hsl.stock.view.activity.NewWebActivity 15.run(NewWebActivity.java:699)atandroid.os.Handler.handleCallback(Handler.java:743)atandroid.os.Handler.dispatchMessage(Handler.java:95)atandroid.os.Looper.loop(Looper.java:150)atandroid.app.ActivityThread.main(ActivityThread.java:5665)atjava.lang.reflect.Method.invoke(NativeMethod)atcom.android.internal.os.ZygoteInit MethodAndArgsCaller.run(ZygoteInit.java:799)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689)

根据异常信息Can not perform this action after onSaveInstanceState,可以了解到异常原因:在onSaveInstanceState行为之后,app执行某个不能响应的行为而导致异常发生。
查看对应的错误信息发现时fragment的commit()方法造成的崩溃.查看官网解决办法是将commit()方法换乘commitAllowingStateLoss ()方法.具体查看

https://developer.android.com/reference/android/app/FragmentTransaction.html#commitAllowingStateLoss()

关于commitAllowingStateLoss ()方法的解释:

Like commit() but allows the commit to be executed after an activity’s state is saved. This is dangerous because the commit can be lost if the activity needs to later be restored from its state, so this should only be used for cases where it is okay for the UI state to change unexpectedly on the user.

用我蹩脚的语法直译一下就是:
使用的 commit方法是在Activity的onSaveInstanceState()之后调用的,这样会出错,因为onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss()就行了,其效果是一样的。或者有使用dialogfragment的show方法报此异常的可使用

getFragmentManager().beginTransaction().add(aaa, “aaa”).commitNowAllowingStateLoss();
dialogfragment的dismiss()方法则换乘dismissAllowingStateLoss();
之后崩溃日志中就不会再报错误了.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值