Fragments中commit()和commitAllowingStateLoss()之间有什么区别

时间:2013-05-25 09:58:54

标签: java android android-fragments

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

无论如何,有时候我遇到了IllegalStateException: Can not perform this action after onSaveInstanceState错误,我找不到任何关于它的好方法,只是这个方法commitAllowingStateLoss()。我将提交功能更改为commitAllowingStateLoss(),但没有长时间使用它进行测试,所以这个功能可以帮助我吗?主要问题是commit()commitAllowingStateLoss()之间有什么区别?

2 个答案:

答案 0 :(得分:90)

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

有关此主题,请参阅我的blog post以获取更多信息。

答案 1 :(得分:1)

commit():

计划此事务的提交。提交不会立即发生;

将其安排为主线程上的工作,以在下次线程准备就绪时进行。

commitAllowingStateLoss():

事务只能在包含活动保存其状态之前通过此方法提交。如果在此之后尝试提交,则将引发异常。这是因为如果活动需要从其状态中恢复,则提交后的状态可能会丢失。有关可能丢失提交的情况,请参见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)