Caused by: android.os.TransactionTooLargeException:data parcel size 696260 bytes异常解决方案

文章详细解析了TransactionTooLargeException异常的原因,特别是在Android N版本中出现此问题的频率较高。当Intent或Binder传输数据过大时,系统会抛出此异常。文章提供了优化方案,如使用静态类存储列表数据,避免在Intent中传递大量数据,从而提高应用性能。

这种异常造成的原因是因为intent或者Binder传输的数据太大导致的异常。 如果Binder的参数或返回值太大,不适合的事务缓冲区,然后调用将失败,并将被抛出TransactionTooLargeException。

我这里出现这个异常的原因是在列表页面点击列表item跳转详情页的时候,除了需要携带选中的item对应的bean参数以外,还要做viewpager左右滑动的操作,所以直接将外面列表的bean类的list 放到了intent中作为参数传递

intent.putExtra("wallpaperBeanList", info as Serializable)

这样当外面列表没有做加载更多只有十几条数据的时候还没有问题,当用户加载了很多分页,list中已经存了上百条甚至上千条数据的时候,再以这样的方式传递参数就会有两个问题出现:

第一,跳转速度慢,因为点击后要做大量的读写操作

第二,就是容易发生TransactionTooLargeException:data parcel size XXXXX  bytes异常,原因就是传输的数据太大了

通过观察在bugly上统计的版本信息发现,报TransactionTooLargeException异常的手机,集中在Android N的版本里,也就是版本号只有24和25的,低于24或者高于25的一概没有。我们的App最低兼容到了16,但是即便在很古老的4.0,4.1,4.4的手机上也没有报这个错误。显然在Android N中,一定有一些特别的地方。

看下官方文档对于7.0发生了什么变动的一段说明:

Many platform APIs have now started checking for large payloads being sent across Bindertransactions, and the system now rethrows TransactionTooLargeExceptions as RuntimeExceptions, instead of silently logging or suppressing them. One common example is storing too much data in onSaveInstanceState(), which causes ActivityThread.StopInfo to throw a RuntimeException when your app targets Android 7.0.

可以看到,7.0的改动日志里确实提到了,Binder的数据传输确实有了新的限制,当数据量比较大的时候就会抛出 TransactionTooLargeExceptions ,不过这里并没有具体的说明到底多大的数据量会造成这个问题。这应该就是原因所在了。限制Binder的数据量,自然是为了性能考虑,虽然可以理解但搞不懂为什么不直接说明具体的限制,当然也许不同配置的手机限制不同。

知道了问题的原因,接下来就是如何解决问题了。

解决方法:采用新的方式来做传递这样容易大的参数,将需要用intent传递的参数变小

我这里采用用一个静态类做这个list参数的存储,当用户初始化这个列表页面,数据加载出来的时候就会给这个静态类的list赋值,当用户加载更多成功的时候也做一次新的赋值,跳转详情页面的时候不做传递这个参数的操作,只传递一个选中的item 的position 的参数,详情页直接获取静态类的list参数,显示刚才用户选中位置的item的信息即可,然后这样做静态参数数据的存储,需要做好内存的释放优化工作,当页面销毁的时候手动将静态参数的list清空,释放内存占用。网上也有用EventBus传递的或者rxjava传递来解决的,我这里没有用这些,用了个比较简单的办法解决了。

总结:开发中遇到问题并不可怕,一定要培养自己分析问题、解决问题的能力。开发工作做的久了,就不能只会写代码了,分析解决问题的能力显然更加重要,对于个人的成长是非常有用的,虽然不一定都要有能力造轮子,但也要学会让自己进阶,提升,摆脱只能“搬砖”的水平,这样以后遇到更加苛刻的问题才能更有能力面对解决……

感谢作者原文地址:https://blog.youkuaiyun.com/wjj1996825/article/details/84771777

FATAL EXCEPTION: main Process: com.tplink.tpm5, PID: 15666 java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1131952 bytes Bundle stats: android:viewHierarchyState [size=1824] android:views [size=1776] androidx.lifecycle.BundlableSavedStateRegistry.key [size=1129376] androidx.lifecycle.internal.SavedStateHandlesProvider [size=1128012] androidx.lifecycle.ViewModelProvider.DefaultKey:com.tplink.apps.feature.advanced.heatmap.viewmodel.ConnectToWifiViewModel [size=375748] values [size=375644] androidx.lifecycle.ViewModelProvider.DefaultKey:com.tplink.apps.feature.advanced.heatmap.viewmodel.HeatmapOverviewViewModel [size=375748] values [size=375644] androidx.lifecycle.ViewModelProvider.DefaultKey:com.tplink.apps.feature.advanced.heatmap.viewmodel.DevicePlacementViewmodel [size=375748] values [size=375644] PersistableBundle stats: [null] at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:146) at android.os.Handler.handleCallback(Handler.java:973) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopOnce(Looper.java:282) at android.os.Looper.loop(Looper.java:387) at android.app.ActivityThread.main(ActivityThread.java:9500) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005) Caused by: android.os.TransactionTooLargeException: data parcel size 1131952 bytes at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(BinderProxy.java:679) at android.app.IActivityClientController$Stub$Proxy.activityStopped(IActivityClientController.java:1545) at android.app.ActivityClient.activityStopped(ActivityClient.java:120) at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:135) ... 8 more
09-06
2025-10-30 19:03:55.611 16318-16318 MainActivity com.tencent.yolov5ncnn D decodeVideo: ------------/-1/2/content:/media/external/video/media/29/ORIGINAL/NONE/video/mp4/1895746813===============/-1/2/content://media/external/video/media/29/ORIGINAL/NONE/video/mp4/1895746813 2025-10-30 19:03:55.678 16318-16325 cent.yolov5ncnn com.tencent.yolov5ncnn I NativeAlloc concurrent mark compact GC freed 1145KB AllocSpace bytes, 3(60KB) LOS objects, 49% free, 1919KB/3839KB, paused 8.932ms,4.182ms total 57.817ms 2025-10-30 19:03:55.717 1938-1951 DatabaseUtils com...ndroid.providers.media.module E Writing exception to parcel java.lang.SecurityException: com.tencent.yolov5ncnn has no access to content://media/external/video/media/29 at com.android.providers.media.MediaProvider.enforceCallingPermissionInternal(MediaProvider.java:11734) at com.android.providers.media.MediaProvider.enforceCallingPermission(MediaProvider.java:11631) at com.android.providers.media.MediaProvider.checkAccess(MediaProvider.java:11755) at com.android.providers.media.MediaProvider.checkAccessForThumbnail(MediaProvider.java:9929) at com.android.providers.media.MediaProvider.ensureThumbnail(MediaProvider.java:9848) at com.android.providers.media.MediaProvider.openTypedAssetFileCommon(MediaProvider.java:9833) at com.android.providers.media.MediaProvider.openTypedAssetFile(MediaProvider.java:9773) at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:677) at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:341) at android.os.Binder.execTransactInternal(Binder.java:1421) at android.os.Binder.execTransact(Binder.java:1365) 2025-10-30 19:03:55.722 16318-16318 MediaStore com.tencent.yolov5ncnn W Failed to obtain thumbnail for content://media/external/video/media/29 java.io.IOException: java.lang.SecurityException: com.tencent.yolov5ncnn has no access to content://media/external/video/media/29 at android.graphics.ImageDecoder$CallableSource.createImageDecoder(ImageDecoder.java:615) at android.graphics.ImageDecoder.decodeBitmapImpl(ImageDecoder.java:1858) at android.graphics.ImageDecoder.decodeBitmap(ImageDecoder.java:1850) at android.content.ContentResolver.loadThumbnail(ContentResolver.java:4173) at android.content.ContentResolver.loadThumbnail(ContentResolver.java:4157) at android.provider.MediaStore$InternalThumbnails.getThumbnail(MediaStore.java:2932) at android.provider.MediaStore$Video$Thumbnails.getThumbnail(MediaStore.java:4612) at com.tencent.yolov5ncnn.MainActivity.decodeVideo(MainActivity.java:450) at com.tencent.yolov5ncnn.MainActivity.onActivityResult(MainActivity.java:237) at android.app.Activity.onActivityResult(Activity.java:7626) at android.app.Activity.internalDispatchActivityResult(Activity.java:9546) at android.app.Activity.dispatchActivityResult(Activity.java:9523) at android.app.ActivityThread.deliverResults(ActivityThread.java:6173) at android.app.ActivityThread.handleSendResult(ActivityThread.java:6223) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:78) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.SecurityException: com.tencent.yolov5ncnn has no access to content://media/external/video/media/29 at android.os.Parcel.createExceptionOrNull(Parcel.java:3340) at android.os.Parcel.createException(Parcel.java:3324) at android.os.Parcel.readException(Parcel.java:3307) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:201) at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:164) at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:814) at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:2045) at android.content.ContentResolver.openTypedAssetFile(ContentResolver.java:1950) at android.content.ContentResolver.lambda$loadThumbnail$0(ContentResolver.java:4174) at android.content.ContentResolver$$ExternalSyntheticLambda0.call(D8$$SyntheticClass:0) at android.graphics.ImageDecoder$CallableSource.createImageDecoder(ImageDecoder.java:610) ... 26 more 2025-10-30 19:03:55.771 16318-16318 ThumbnailUtils com.tencent.yolov5ncnn W java.io.IOException: Failed to create thumbnail at android.media.ThumbnailUtils.createVideoThumbnail(ThumbnailUtils.java:391) at android.media.ThumbnailUtils.createVideoThumbnail(ThumbnailUtils.java:333) at com.tencent.yolov5ncnn.MainActivity.decodeVideo(MainActivity.java:454) at com.tencent.yolov5ncnn.MainActivity.onActivityResult(MainActivity.java:237) at android.app.Activity.onActivityResult(Activity.java:7626) at android.app.Activity.internalDispatchActivityResult(Activity.java:9546) at android.app.Activity.dispatchActivityResult(Activity.java:9523) at android.app.ActivityThread.deliverResults(ActivityThread.java:6173) at android.app.ActivityThread.handleSendResult(ActivityThread.java:6223) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:78) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.IllegalArgumentException: /storage/emulated/0/Download/20251011_112303.mp4 does not exist at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:255) at android.media.ThumbnailUtils.createVideoThumbnail(ThumbnailUtils.java:362) ... 21 more 2025-10-30 19:03:55.776 16318-16318 MainActivity com.tencent.yolov5ncnn D decodeVideo_address: ====================/storage/emulated/0/Download/20251011_112303.mp4-------/storage/emulated/0 2025-10-30 19:03:55.956 16318-16318 MediaCodecList com.tencent.yolov5ncnn D codecHandlesFormat: no format, so no extra checks 2025-10-30 19:03:55.958 16318-16318 MediaCodecList com.tencent.yolov5ncnn D codecHandlesFormat: no format, so no extra checks 2025-10-30 19:03:55.969 16318-16389 CCodec com.tencent.yolov5ncnn D allocate(c2.goldfish.h264.decoder) 2025-10-30 19:03:55.975 16318-16389 ApexCodecsLazy com.tencent.yolov5ncnn I Failed to load libcom.android.media.swcodec.apexcodecs.so: dlopen failed: library "libcom.android.media.swcodec.apexcodecs.so" not found 2025-10-30 19:03:55.975 16318-16389 Codec2Client com.tencent.yolov5ncnn I Available Codec2 services: "default" "software" 2025-10-30 19:03:55.985 16318-16389 CCodec com.tencent.yolov5ncnn I setting up 'default' as default (vendor) store 2025-10-30 19:03:56.003 16318-16389 CCodec com.tencent.yolov5ncnn I Created component [c2.goldfish.h264.decoder] for [c2.goldfish.h264.decoder] 2025-10-30 19:03:56.005 16318-16389 CCodecConfig com.tencent.yolov5ncnn D read media type: video/avc 2025-10-30 19:03:56.023 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: algo.buffers.max-count.values 2025-10-30 19:03:56.024 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: output.subscribed-indices.values 2025-10-30 19:03:56.025 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: input.buffers.allocator-ids.values 2025-10-30 19:03:56.026 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: output.buffers.allocator-ids.values 2025-10-30 19:03:56.027 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: algo.buffers.allocator-ids.values 2025-10-30 19:03:56.027 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: output.buffers.pool-ids.values 2025-10-30 19:03:56.028 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D extent() != 1 for single value type: algo.buffers.pool-ids.values 2025-10-30 19:03:56.033 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D ignored struct field coded.color-format.locations 2025-10-30 19:03:56.041 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D ignored struct field resources.needed.values 2025-10-30 19:03:56.041 16318-16389 CCodecConfig com.tencent.yolov5ncnn D ignoring local param raw.size (0xd2001800) as it is already supported 2025-10-30 19:03:56.041 16318-16389 CCodecConfig com.tencent.yolov5ncnn D ignoring local param default.color (0x5200180b) as it is already supported 2025-10-30 19:03:56.041 16318-16389 ReflectedParamUpdater com.tencent.yolov5ncnn D ignored struct field raw.hdr-static-info.mastering 2025-10-30 19:03:56.044 16318-16389 CCodecConfig com.tencent.yolov5ncnn I query failed after returning 12 values (BAD_INDEX) 2025-10-30 19:03:56.045 16318-16389 CCodecConfig com.tencent.yolov5ncnn D c2 config diff is Dict { c2::u32 coded.pl.level = 20496 c2::u32 coded.pl.profile = 20481 c2::u32 coded.vui.color.matrix = 0 c2::u32 coded.vui.color.primaries = 0 c2::u32 coded.vui.color.range = 2 c2::u32 coded.vui.color.transfer = 0 c2::u32 default.color.matrix = 0 c2::u32 default.color.primaries = 0 c2::u32 default.color.range = 0 c2::u32 default.color.transfer = 0 c2::u32 input.buffers.max-size.value = 6291456 c2::u32 input.delay.value = 0 string input.media-type.value = "video/avc" c2::u32 output.delay.value = 8 string output.media-type.value = "video/raw" c2::u32 raw.color.matrix = 0 c2::u32 raw.color.primaries = 0 c2::u32 raw.color.range = 2 c2::u32 raw.color.transfer = 0 c2::u32 raw.max-size.height = 240 c2::u32 raw.max-size.width = 320 c2::u32 raw.pixel-format.value = 35 c2::i32 raw.rotation.flip = 0 c2::i32 raw.rotation.value = 0 c2::u32 raw.sar.height = 1 c2::u32 raw.sar.width = 1 c2::u32 raw.size.height = 240 c2::u32 raw.size.width = 320 c2: 2025-10-30 19:03:56.046 16318-16389 ColorUtils com.tencent.yolov5ncnn W expected specified color aspects (2:0:0:0) 2025-10-30 19:03:56.080 16318-16318 TransactionExecutor com.tencent.yolov5ncnn E Failed to execute the transaction: tId:551909865 ClientTransaction{ tId:551909865 transactionItems=[ tId:551909865 TopResumedActivityChangeItem{mActivityToken=android.os.BinderProxy@7bd4eec,onTop=true} tId:551909865 Target activity: com.tencent.yolov5ncnn.MainActivity tId:551909865 ActivityResultItem{mActivityToken=android.os.BinderProxy@7bd4eec,resultInfoList=[ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/... flg=0x1 xflg=0x4 clip={text/uri-list {U(content)}} }}]} tId:551909865 Target activity: com.tencent.yolov5ncnn.MainActivity tId:551909865 ResumeActivityItem{mActivityToken=android.os.BinderProxy@7bd4eec,procState=2,isForward=false,shouldSendCompatFakeFocus=false} tId:551909865 Target activity: com.tencent.yolov5ncnn.MainActivity tId:551909865 ] tId:551909865 } 2025-10-30 19:03:56.081 16318-16318 AndroidRuntime com.tencent.yolov5ncnn D Shutting down VM 2025-10-30 19:03:56.082 16318-16318 AndroidRuntime com.tencent.yolov5ncnn E FATAL EXCEPTION: main Process: com.tencent.yolov5ncnn, PID: 16318 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/... flg=0x1 xflg=0x4 clip={text/uri-list {U(content)}} }} to activity {com.tencent.yolov5ncnn/com.tencent.yolov5ncnn.MainActivity}: java.lang.IllegalArgumentException: The surface has been released at android.app.ActivityThread.deliverResults(ActivityThread.java:6184) at android.app.ActivityThread.handleSendResult(ActivityThread.java:6223) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:78) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.IllegalArgumentException: The surface has been released at android.media.MediaCodec.native_configure(Native Method) at android.media.MediaCodec.configure(MediaCodec.java:2562) at android.media.MediaCodec.configure(MediaCodec.java:2422) at com.tencent.yolov5ncnn.MainActivity.decodeVideo(MainActivity.java:514) at com.tencent.yolov5ncnn.MainActivity.onActivityResult(MainActivity.java:237) at android.app.Activity.onActivityResult(Activity.java:7626) at android.app.Activity.internalDispatchActivityResult(Activity.java:9546) at android.app.Activity.dispatchActivityResult(Activity.java:9523) at android.app.ActivityThread.deliverResults(ActivityThread.java:6173) ... 14 more
10-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值