产生原因
TransactionTooLargeException
原因分析:在应用层与各种SystemService
交互过程中,调用参数和返回值会通过Parcel
对象存储在Binder Transaction缓冲区中以进行传输,如果参数或返回值太大超过了Binder Transaction缓冲区的限制大小,那么调用将会失败抛出TransactionTooLargeException。在日常开发中,TransactionTooLargeException
通常是由于都是传输的数据过大
或页面被杀死时缓存的数据过大
导致的。
使用toolargetool来定位传输数据过大的页面
TransactionTooLargeException
通常难以定位问题,这里我们推荐使用toolargetool进行定,逐一找出传输数据过大的页面进行分析和修复。模拟在后台过久被系统杀死可以通过开发者选项
-选择不保留活动
来模拟。
常见的原因一:Fragment.setArguments传输的Bundle过大
我们应特别注意通过Fragment.setArguments
所传递的Bundle的数据大小,如果数据量较大,应该选择使用其他方式进行传输。
常见的原因二:页面回收恢复后,重复创建Fragment导致重复的缓存数据
通过FragmentManager.beginTransaction.add.commit
添加Framgnet
时,但页面回收恢复后,FragmentManager
仍然会保留所有之前的Fragment
,所以:
方式一:重复使用缓存的Fragment,不再重复创建
方式二:在页面回收恢复后,先删除之前的所有Fragment
val fragmentTransaction = fragmentManager.beginTransaction()
fragments.forEach {
fragmentTransaction.remove(it)
}
fragmentTransaction.commitAllowingStateLoss()
常见的原因三:ViewPager2.setOffscreenPageLimit太大导致Fragment被杀死时缓存的数据过大
如果页面数据很大,我们也应该格外注意setOffscreenPageLimit,如果OffscreenPageLimit的数量过大,应该选择使用本地持久化等方式对页面数据进行缓存