19

我的应用程序在某些用户设备上不断崩溃,在 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上发现了一些关于这个问题的问题: herehere

我已经尝试过建议的解决方案,即在 onSaveInstance 中不允许在片段或活动中使用空包。

然而问题依然存在。这是我得到的唯一崩溃报告,而且我不断得到它。

有没有人有一个可行的解决方案?

4

3 回答 3

8

我已经解决了这个问题

  • 将我的支持库升级到修订版 10
  • 使用此处发布的解决方法: http ://code.google.com/p/android/issues/detail?id=23096 即。在 onResumeFragments 中添加一个非 UI 片段,并在 Listener Callback 中调用进一步的事务。

在此处查看我的答案以获取代码:“在 onSaveInstanceState 之后无法执行此操作” - 为什么我会从我的活动的 onResume 方法中获得此异常?

到目前为止没有更多的 IllegalStateException。

于 2012-08-13T09:40:12.803 回答
4

我使用此解决方法解决了这个问题,即将代码放入onPostResume()Activity 中的方法函数中

于 2013-01-07T02:37:16.097 回答
-1

阅读这篇文章。

和,

这个。

一旦理解了问题,请继续并正确更改:

弄清楚为什么你的交易发生在你的 onResume 状态之外。为什么这些事情在不应该发生的时候发生。为什么要根据应用程序的生命周期手动添加和删除片段,而不是在用户请求时。您可能需要在 onCreate() 或用户调用某些内容时需要一次。但是你为什么一开始就在 onResume() 中惹他们呢?不要那样做。

如果您将所有更改为.commit().commitAllowStateLoss()那么崩溃将消失。但是,你最好不要那样做。你最好确保你永远不会改变你的片段,除非应用程序完全上线。有时这意味着永远不要从 OnActivityResult() 加载片段,而是标记为在 onPostResume() 中运行,并避免在异步线程中执行 UI 更改,这些线程错误地认为您不能同时终止活动。

如果你只是想把所有东西都弄脏,.commitAllowStateLoss()会这样做。如果你想把它做好,请确保在事物死亡后不要摆弄你的碎片。

我认为最新形式的 Android 大约是奥利奥之一,为了避免这个恼人的错误而改变了这一点。我的回答似乎有点含糊,但这是因为错误在范式中。您完全可以使用各种代码元素并且相当常规地实现这一目标。

于 2017-06-18T07:18:08.893 回答