原因是使用了Fragment+ViewPager2+FragmentStatePagerAdapter
如果使用了 FragmentStatePagerAdapter 作为 fragment 适配器,为了尽可能过缓存下浏览过的 fragment 以获得更好的体验,承载多个 FragmentStatePagerAdapter#saveState 会被调用并对每一个 fragment 的 bundle 数据进行保存。并且保存下来的 bundle 并不会因为 fragment 被销毁而销毁,所以需要保存的 bundle 数据会一直增长,直到出现TransactionTooLargeException 异常
FragmentStateAdapter源码:
stackoverflow的解决方案
上面的解决方案是重写saveState方法,但是最新的代码已经无法实现重写了
解决方案:
最终是在Fragment中,通过argument获取完数据后,马上调用arguments.clear方法,将数据清空,这样在saveState的时候就不会保存大量数据了
Tips:此工具 toolargetool 可以在开发中实时观测页面内存变化。