分析TransactionTooLargeException常见原因

产生原因

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的数量过大,应该选择使用本地持久化等方式对页面数据进行缓存

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。