gpt4 book ai didi

Activity 保存的 android:support:fragments 越来越大并导致 TransactionTooLargeException

转载 作者:行者123 更新时间:2023-12-03 15:51:38 25 4
gpt4 key购买 nike

我有一个控制几个 fragment 的 Activity 。默认 fragment 为 HomepageFragment .当替换到不同的 Fragment 时,我总是确保堆栈保持平坦 - 仅意味着 HomepageFragment留在堆栈中,当前的 Fragment 位于堆栈之上。例如:

  • Activity 以 HomepageFragment 打开
  • 替换为 FragmentA需要 - 一切都是好的原因HomepageFragment是最后一个 fragment
  • 现在堆栈是 HomepageFragment -> FragmentA
  • 替换为 FragmentB需要 - 首先弹出堆栈上的最后一个 fragment (fragmentA),而不是替换为 FragmentB
  • 现在堆栈是 HomepageFragment -> FragmentB

  • 在生产中我看到很多 TransactionTooLargeException崩溃。

    我用了 TooLargeTool跟踪问题的来源,我发现当我在 Activity 中的 fragment 之间切换时,有一个 android:support:fragments键入 SaveInstanceState在崩溃发生之前,它会越来越大(以指数方式)。

    似乎即使从堆栈中弹出,有关原始事务的一些数据也会继续保存。

    按照建议删除它 here导致 Activity 在被操作系统杀死后无法正常恢复。

    我的压平堆栈的方法有问题吗?
    有更好的方法吗? android:support:fragments 下到底保存了哪些数据?

    注: 我没有为这些 fragment 设置任何论据。此外,他们在他们的 saveInstanceState 包中保存了非常小的数据。

    谢谢!

    最佳答案

    我通过 supportFragmentManager.registerFragmentLifecycleCallbacks 做了一些调试在我的 Activity 中,在 onFragmentSaveInstanceState 中覆盖并设置断点.
    所以看来 android:support:fragments bundle 括

  • 从 ViewModel 中保存的状态 (SavedStateHandle)
  • 后栈中 Fragments 的导航参数

  • 在我的例子中,罪魁祸首是一个自定义的 Parcelable,它可以增长到数百 kB。在后台堆栈和 SavedStateHandles 中有多个应用程序将超过 1MB 阈值并崩溃。
    我通过仅传递该 Parcelable 的 ID 并从我的存储库中加载它来解决问题。性能略有下降,但不再崩溃。

    关于Activity 保存的 android:support:fragments 越来越大并导致 TransactionTooLargeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57584987/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com