Android:support:fragments 由Activity保存,导致TransactionTooLargeException异常问题越来越严重。

12
我有一个Activity,控制着多个Fragment。默认的Fragment是HomepageFragment。当替换为不同的Fragment时,我总是确保堆栈保持扁平-意味着只有HomepageFragment保留在堆栈中,并且当前Fragment位于其上方。例如:
  1. 打开带有HomepageFragment的Activity
  2. 需要替换为FragmentA - 因为HomepageFragment是最后一个Fragment,所以一切都很好
  3. 现在堆栈是HomepageFragment -> FragmentA
  4. 需要替换为FragmentB - 首先弹出堆栈上的最后一个Fragment(fragmentA),然后用FragmentB替换它
  5. 现在堆栈是HomepageFragment -> FragmentB
在生产环境中,我看到了很多TransactionTooLargeException崩溃。
我使用TooLargeTool来追踪问题出现的位置,发现当我在Activity中切换Fragment时,在SaveInstanceState中有一个android:support:fragments键,它会越来越大(指数级增长),直到崩溃发生。
似乎即使从堆栈中弹出,仍会保存有关原始事务的一些数据。

按照这里的建议移除它会导致 Activity 被操作系统杀掉后无法正确恢复。

我的堆栈平铺方法是否有问题? 是否有更好的方法? android:support:fragments下保存了哪些数据?

注意:我没有向这些片段设置任何参数。此外,它们在其saveInstanceState包中保存非常少的数据。

谢谢!


1
https://dev59.com/6a7la4cB1Zd3GeqPlvbX#52716351 - ॐ Rakesh Kumar
https://stackoverflow.com/questions/13093677/android-fragment-android-support-v4-app-fragment-crashing-the-app - Raju Tukadiya
@EpicPandaForce 不,Fragment的bundle数据非常小,问题只在于保存在Activity的bundle中的android:support:fragments键。 - Shirane85
片段保存状态包含ViewState,您可能会在其中一个片段或其视图中保存一些内容。 - EpicPandaForce
显示剩余7条评论
1个回答

0

我在我的Activity中通过supportFragmentManager.registerFragmentLifecycleCallbacks进行了一些调试,重写并在onFragmentSaveInstanceState中设置了断点。

因此,似乎android:support:fragments Bundle包括:

  1. ViewModels(SavedStateHandle)的保存状态
  2. 后退栈上的Fragments的导航参数

在我的情况下,罪魁祸首是一个自定义的Parcelable,它可以增长到几百KB。如果在后退栈和SavedStateHandles中有多个这样的对象,应用程序将超过1MB的阈值并崩溃。

我通过仅传递该Parcelable的ID并从我的Repository中加载它来解决了问题。对性能有轻微影响,但不再崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接