commitAllowingStateLoss

commitAllowingStateLoss

我的应用程序使用片段 Activity ,它仅处于纵向模式,无法旋转屏幕。

最初我使用的是commit()方法,但现在我打算不加区分地将这些更改为commitAllowingStateLoss()来进行片段 Activity

有什么理由不对我使用片段的每个个案进行重新评估就不加选择地这样做吗?

最佳答案

如果我理解正确,您的意思是:在不重新评估我使用片段的每个个案的情况下,有没有理由不加选择地这样做吗?

答案是肯定的-除非仔细评估每个使用片段的个案,否则不要这样做。

当然,通过防止由于配置更改(屏幕旋转)而导致的重启,您已经消除了关键问题区域之一:即,用户可以在调用onSaveInstanceState之后但在commitAllowingStateLoss之前旋转屏幕。在这种情况下,UI的一部分或片段可能会丢失。有关此问题的非正式讨论,请参见post

但是在将commit替换为commitAllowingStateLoss之前,还应考虑其他情况。

  • 基本上,在onSaveInstanceState和commitAllowingStateLoss之间的所有UI更新:
    Android: IllegalStateException - When is it thrown?
  • 如果您有任何 headless 的片段来更新您的 Activity 的UI,那么它们的某些更新可能会丢失(请参阅此article)。
  • Android可能会“杀死”一个片段,因为电话/选项卡的资源不足(请参阅此answer)。

  • 当然,如果阻止了屏幕旋转,则可能不会调用onSaveInstanceState,在这种情况下,丢失更新机会的窗口会增加。

    如果您确实决定使用commitAllowingStateLoss,则可以采取以下措施来最大程度地降低所涉及的风险:下一次重新启动父级 Activity 时,请考虑执行commit/executePendingTransactions(我知道您不想这样做,但其他人可能会阅读this)。

    最后(再次,以防其他人读到此内容-与您的情况无关),处理IllegalStateException可能比从commit移到commitAllowStateLoss更为安全。例如,您可以坚持提交并处理IllegalStateException。或者,您可能在Android中打了一个bug,可能有解决方法。

    10-08 17:06