【发布时间】:2019-12-26 08:10:42
【问题描述】:
我有一个控制几个片段的活动。默认片段为HomepageFragment。当替换到不同的 Fragment 时,我总是确保堆栈保持平坦 - 这意味着只有 HomepageFragment 留在堆栈中,并且在它的顶部是当前 Fragment。例如:
- 以
HomepageFragment打开的活动 - 需要替换为
FragmentA- 一切都很好,因为HomepageFragment是最后一个片段 - 现在堆栈是
HomepageFragment->FragmentA - 需要替换为
FragmentB- 首先弹出堆栈中的最后一个片段(fragmentA),而不是替换为FragmentB - 现在堆栈是
HomepageFragment->FragmentB
在生产中,我看到很多 TransactionTooLargeException 崩溃。
我使用TooLargeTool 来跟踪问题的来源,我发现当我在活动中的片段之间切换时,SaveInstanceState 中有一个android:support:fragments 键,它变得越来越大(以指数方式)直到崩溃发生。
似乎即使从堆栈中弹出,有关原始交易的一些数据也会继续保存。
按照建议 here 删除它会导致 Activity 在被操作系统杀死后无法正常恢复。
我的压平堆栈的方法有问题吗?
有更好的方法吗?
android:support:fragments下到底保存了哪些数据?
注意:我没有为这些片段设置任何参数。此外,他们在他们的 saveInstanceState 包中保存了非常小的数据。
谢谢!
【问题讨论】:
-
@ManojPerumarath 我没有将任何数据传输到这些片段。我的情况完全不同,是由于 ACTIVITY 中的一些键变得越来越大,只有在大约 20 个片段之后它才大到足以崩溃。请删除重复项。
-
也许您正在保存位图?也许您正在使用像 ImageCropper 这样的 aibraey,它将位图持久保存到 Bundle?
标签: android android-fragments android-activity onsaveinstancestate transactiontoolargeexception