【问题标题】:What is the difference between commit() and commitAllowingStateLoss() in FragmentsFragments 中的 commit() 和 commitAllowingStateLoss() 有什么区别
【发布时间】:2013-05-25 09:58:53
【问题描述】:

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

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

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

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

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

    【讨论】:

    • 区别比这更微妙。如果状态丢失不会发生,commit() 可以抛出异常事件。例如,commit() 在从LoaderCallbacks.onLoadFinished() 调用时总是抛出异常,即使在commitAllowingStateLoss() 保存事务而不丢失状态的情况下也是如此。当然,有时在处理onLoadFinished()时无法保存状态。
    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2017-07-30
      • 2020-04-03
      • 2011-08-23
      • 1970-01-01
      • 2021-02-26
      • 2011-02-14
      • 2018-03-27
      相关资源
      最近更新 更多