我的应用程序在一些用户设备上连续崩溃,但在Activity onStart方法中出现以下异常,我遇到了严重问题:
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123)
我无法在我的模拟器中本地重现此错误。我在stackoverflow上找到了一些关于这个问题的问题: here和 here
我已尝试过建议的解决方案,即不允许在片段或活动中使用onSaveInstance中的空包。
然而问题仍然存在。这是我得到的唯一一个Crash报告,我不断得到它。
有没有人有工作解决方案?
答案 0 :(得分:8)
我已经通过
解决了这个问题在此处查看我的答案以获取代码:"Can not perform this action after onSaveInstanceState" - why am I getting this exception from my activity's onResume method?
到目前为止没有更多的IllegalStateException。
答案 1 :(得分:4)
我使用this workaround解决了这个问题,即将代码放入Activity中的方法onPostResume()
函数
答案 2 :(得分:-1)
和
一旦理解了问题,请继续并正确地改变事情:
找出您的onResume状态之外的事务发生原因。为什么这些事情发生在他们不应该发生的时候。为什么要手动添加和删除与应用程序生命周期相关的片段,而不是在用户请求时。您可能需要在onCreate()或用户调用某些内容时需要一次。但是你为什么要首先在onResume()中弄乱它们呢?不要那样做。
如果您将所有.commit()
更改为.commitAllowStateLoss()
,那么崩溃将会消失。但是,你最好不要这样做。除非应用程序完全正常,否则最好确保永远不会更改碎片。有时这意味着永远不会从OnActivityResult()加载片段,而是标记为在onPostResume()中运行,并避免在异步线程中执行UI更改,错误地认为您不能在此期间杀死该活动。
如果您只想打包一切,.commitAllowStateLoss()
会这样做。如果你想做得对,请确保在事情消亡后不要弄乱你的碎片。
我认为最近的一种形式的Android大约奥利奥,改变了这一点以避免这种恼人的错误。我的回答似乎有点模糊,但这是因为错误在范例中。你完全可以使用各种代码元素并且相当常规地使用它。