Shi*_*e85 11 android android-fragments android-activity onsaveinstancestate transactiontoolargeexception
我有一个控制多个片段的活动。默认片段是HomepageFragment. 当替换到不同的 Fragment 时,我总是确保堆栈保持平坦 - 这意味着只有HomepageFragment保持在堆栈中并在其顶部是当前 Fragment。例如:
HomepageFragmentFragmentA需要替换 to - 一切都是好的原因HomepageFragment是最后一个 FragmentHomepageFragment->FragmentA FragmentB需要替换为- 首先弹出堆栈上的最后一个 Fragment ( fragmentA) 然后替换为FragmentBHomepageFragment->FragmentB在生产中,我看到很多TransactionTooLargeException崩溃。
我曾经TooLargeTool跟踪问题的来源,我发现当我在活动中的片段之间切换时,其中有一个android:support:fragments键SaveInstanceState变得越来越大(呈指数级),直到发生崩溃。
似乎即使从堆栈中弹出时,有关原始事务的一些数据也会继续保存。
按照此处的建议将其删除会导致 Activity 在被操作系统杀死后无法正确恢复。
我压平堆栈的方法有什么问题吗?有没有更好的方法?究竟保存在什么数据下android:support:fragments?
注意:我没有为这些片段设置任何参数。此外,它们在其 saveInstanceState 包中保存了非常小的数据。
谢谢!
我通过supportFragmentManager.registerFragmentLifecycleCallbacks在我的 Activity 中进行了一些调试,在onFragmentSaveInstanceState.
所以看来android:support:fragments捆绑包包括
就我而言,罪魁祸首是一个自定义的 Parcelable,它可能会增长到数百 kB。如果后台堆栈上和 SavedStateHandles 中有多个这样的数据,应用程序将超过 1MB 阈值并崩溃。
我通过仅传递该 Parcelable 的 ID 并从我的存储库加载它来解决了这个问题。性能略有下降,但不再发生崩溃。
| 归档时间: |
|
| 查看次数: |
886 次 |
| 最近记录: |