commit()和commitAllowingStateLoss()之间只有一个区别:如果发生状态丢失,后者不会抛出异常。除此之外,它们的行为完全相同。
有关更多信息,请参见我关于此主题的博客文章。
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)
commit()也可能抛出异常事件。例如,即使在commitAllowingStateLoss()保存事务而没有状态丢失的情况下,从LoaderCallbacks.onLoadFinished()调用commit()总是会抛出异常。当然,在处理onLoadFinished()时有时无法保存状态。 - Juozas Kontvainis