【问题标题】:When is it safe to commit a FragmentTransaction?什么时候提交 FragmentTransaction 是安全的?
【发布时间】:2016-11-08 15:14:19
【问题描述】:

根据docs

片段事务只能在 活动保存其状态。如果您尝试在之后提交事务 Activity.onSaveInstanceState() (以及在以下 Activity.onStart 或 Activity.onResume(),会报错。

我可以理解在Activity.onSaveInstanceState()之后片段事务不能提交的第一部分, 因为如果需要恢复活动,提交后的状态可能会丢失。

但我不明白为什么我们不能在 Activity.onStart 或 Activity.onResume() 之前提交片段事务? oncreate() 也是在Activity.onStart 或者Activity.onResume() 之前。是不是说我们在oncreate() 中都不能提交呢?

【问题讨论】:

    标签: android android-fragments fragmenttransaction


    【解决方案1】:

    这里的关键是你不能在调用onSaveInstanceState()之后提交事务在下面onStart()onResume()之前。

    您可以在初始onCreate() 和后续onStart()onResume() 上提交事务,因为没有状态。

    但是,如果 Activity 正在恢复其状态(即先前调用了 onSaveInstanceState(),并且 Activity 正在使用该状态重新创建自身,则您无法执行 Fragment 事务。这是因为如果您在Activity 恢复之前的 Fragment 状态,您最终会处于不清楚自己处于什么状态的情况。保存的状态是否优先于您通过提交 Fragment 事务创建的新状态,还是应该新事务优先超过保存状态?

    检查这种情况的最简单方法是检查传递给onCreate() 和其他生命周期方法的savedInstanceState 包是否为空。如果它为空,则没有保存状态,您可以安全地执行交易。如果它不为 null,则可能存在您想要保留的已保存状态。

    【讨论】:

    • 我不明白为什么onCreate()中没有状态?当 savedInstanceState 包传递给 onCreate() 时,状态是否尚未恢复?我们可以在 onCreate() 或 onRestoreInstanceState 中恢复状态。
    • onCreate()中的状态还没有恢复,因为刚刚创建了Activity。例如,您甚至还没有创建/设置内容视图,所以保存的视图无处可去。如果您愿意,您可以在onCreate() 中恢复您的应用程序状态,但这并不意味着所有其他组件都已完成恢复其状态。
    • 是不是说oncreate()完成时setContentView()还在运行,一直运行到onResume()开始运行?
    • onCreate() 完成时,setContentView() 尚未运行。通常这发生在onCreate() 内部。然而,视图状态只是调用onCreate() 时可能尚未恢复的状态的一个示例。
    • 所以内容视图已经设置,savedInstanceState bundle(即保存的视图状态)已经发送到onCreate(),你能解释一下为什么调用onCreate()时视图状态没有恢复吗?
    【解决方案2】:

    onSaveInstanceState()之前的任何时候都是安全的,这基本上意味着在onPause()/onResume()之前,如果你的活动曾经去过onPause(),那么只有在onResume()之后才是安全的。

    例如,在onActivityResult() 期间,您实际上并没有在onResume() 之后进入,因此在onActivityResult() 中打开对话框可能会崩溃。

    【讨论】:

      【解决方案3】:

      可能要记住,已提交事务可能执行
      这可以处理:

      getSupportFragmentManager().executePendingTransactions();
      

      【讨论】:

        猜你喜欢
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多