- 问题:TransactionTooLargeException:
- TransactionTooLargeException
- TransactionTooLargeException
- TransactionTooLargeException问题解决
- 关于Android引发TransactionTooLargeEx
- 处理 TransactionTooLargeException
- Android Activity间Intent传递数据报Tra
- Intent数据大小限制及TransactionTooLarge
- TransactionTooLargeException 之 N
- TransactionTooLargeException 解决办
问题描述:
当在进行Activity间传递数据的时候,会出现如下的异常:
java.lang.RuntimeException:android.os.TransactionTooLargeException: data parcel size 587588 bytes
android.app.ActivityThread$StopInfo.run(ActivityThread.java:3939)
......
Caused by:
android.os.TransactionTooLargeException:data parcel size 587588 bytes
android.os.BinderProxy.transactNative(Native Method)
android.os.BinderProxy.transact(Binder.java:619)
android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3748)
android.app.ActivityThread$StopInfo.run(ActivityThread.java:3931)
android.os.Handler.handleCallback(Handler.java:751)
android.os.Handler.dispatchMessage(Handler.java:95)
android.os.Looper.loop(Looper.java:154)
android.app.ActivityThread.main(ActivityThread.java:6285)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:939)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:829)
这里的TransactionTooLargeException
异常,说明Intent
传递的数据(这里为 587588 bytes )太大了。
原因:
由于在通过Intent
进行传递数据,有大小限制(具体限制不同版本,不同系统可能都是不同的),就导致当数据大小超过了系统限制,则会出现如上的异常。
在官方文档中也有如下说明:
The Binder transaction failed because it was too large.
During a remote procedure call, the arguments and the return value of the call are transferred as Parcel objects stored in the Binder transaction buffer. If the arguments or the return value are too large to fit in the transaction buffer, then the call will fail and TransactionTooLargeException will be thrown.
The Binder transaction buffer has a limited fixed size, currently 1Mb, which is shared by all transactions in progress for the process. Consequently this exception can be thrown when there are many transactions in progress even when most of the individual transactions are of moderate size.
Intent
传递数据,其内部也是通过Binder
来进行数据传递的,限制传递数据的大小,则是为了考虑性能问题。
解决方案:
解决的根本办法:就是避免传递大数据量的值,限制传值的大小。
1、减小传递的数据量
一般传递大数据量的内容,基本都是实例对象,可以通过将实例对象格式化为字符串,会显著减小数据体积,因为类的结构越复杂,体积减少的越多。
常用方式即Gson
的格式化对象。先转化为字符串,在接收的时候再转成实例对象。
2、保存数据到本地再获取
对于比较复杂的数据结构的对象实体,可能在转化为字符串之后,数据量仍然会很大,比如对象列表等,此时,可以将其转化为字符串,保存到内部存储或SharedPreferences
中,在接收的时候,在取出来。
3、使用EventBus等消息事件传递的机制
用EventBus的话,我们可以使用粘性事件,postStickyEvent,然后在下一个Activity中接收。
网友评论