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