56

我在我的项目中使用了用片段构建它的提交方法。

无论如何,有时我会IllegalStateException: Can not perform this action after onSaveInstanceState出错,我找不到任何好的解决方案,只有这种方法commitAllowingStateLoss()。我将提交功能更改为commitAllowingStateLoss()但没有长时间使用它来测试,所以这个功能可以帮助我吗?commit()主要问题是和有什么区别commitAllowingStateLoss()

4

2 回答 2

103

commit()和之间只有一个区别commitAllowingStateLoss():如果发生状态丢失,后者不会抛出异常。除此之外,它们具有相同的行为。

有关更多信息,请参阅我关于此主题的博客文章。

于 2013-08-20T22:02:11.143 回答
4

犯罪():

安排此事务的提交。提交不会立即发生;它将被安排在主线程上的工作,以便在该线程下一次准备好时完成。

提交允许状态损失():

事务只能在其包含的活动保存其状态之前使用此方法提交。如果在该点之后尝试提交,则会引发异常。这是因为如果活动需要从其状态恢复,则提交后的状态可能会丢失。请参阅 commitAllowingStateLoss() 以了解可以丢失提交的情况。

如果你在 onSaveInstance() 之后执行 commit(),你会得到以下异常:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
于 2019-09-07T13:08:01.650 回答