在Fragments中,commit()和commitAllowingStateLoss()有什么区别?

62
我在使用适用于 Fragment 的 commit 方法时,遇到了 IllegalStateException: Can not perform this action after onSaveInstanceState 错误。我无法找到任何解决方法,只好尝试使用 commitAllowingStateLoss() 这个方法。我将 commit 方法更改为 commitAllowingStateLoss(),但由于没有长时间测试,因此不确定这个方法是否有效。而且,我想知道 commit() 和 commitAllowingStateLoss() 之间有什么区别?请您帮忙解答。
2个回答

110

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

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


1
区别更加微妙。即使不会发生状态丢失,commit()也可能抛出异常事件。例如,即使在commitAllowingStateLoss()保存事务而没有状态丢失的情况下,从LoaderCallbacks.onLoadFinished()调用commit()总是会抛出异常。当然,在处理onLoadFinished()时有时无法保存状态。 - Juozas Kontvainis

4

commit():

提交当前事务。该提交不会立即发生,而是会在主线程上安排一个任务,在下一次准备好的时候执行。

commitAllowingStateLoss():

只有在所包含的 Activity 保存其状态之前,才可以使用此方法提交事务。如果在此之后尝试提交,则会抛出异常。这是因为如果需要从其状态中恢复 Activity,则提交之后的状态可能会丢失。请参见 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接