活动暂停时的TransactionTooLargeException

时间:2017-11-13 17:03:23

标签: java android android-fragments exception transactions

我正在创建一个应用程序,在那里我将Bundle中的Service非常大的数据发送到Activity。但我没有使用Messenger。相反,我将数据分配给单例类中的变量,然后我从该单例类中检索数据并将其分配给活动。

Activity中,我有一个ViewPager,其中有两个片段被充气。 Bundle被发送到这两个Fragment类。

现在,当活动暂停时,应用程序会抛出以下异常:

at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4209)
                                                                        at android.os.Handler.handleCallback(Handler.java:751)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        at android.os.Looper.loop(Looper.java:154)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6776)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
                                                                     Caused by: android.os.TransactionTooLargeException: data parcel size 4538408 bytes
                                                                        at android.os.BinderProxy.transactNative(Native Method)
                                                                        at android.os.BinderProxy.transact(Binder.java:628)
                                                                        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:4183)
                                                                        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4201)
                                                                        at android.os.Handler.handleCallback(Handler.java:751) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                        at android.os.Looper.loop(Looper.java:154) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6776) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

请帮忙。

2 个答案:

答案 0 :(得分:0)

  

正在将捆绑包发送到这两个片段类。

不要将大量内容放入已保存的实例状态Bundle。对于片段,“参数”BundlesetArguments())成为已保存实例状态Bundle的一部分,因此不要将大量内容放入参数Bundle中。保存的实例状态Bundle适用于少量数据:尽可能少,但足以让您在流程终止后恢复UI状态。

相反,做一些其他事情,例如:

  • 让片段调用托管活动上的方法来获取此数据,或
  • 使用ViewModel,以便在配置更改中保留此数据,但不属于已保存的实例状态Bundle

答案 1 :(得分:-1)

来自Android Developers - TransactionTooLargeException

  

Binder事务缓冲区的固定大小有限,目前为1Mb

从类似的问题: What to do on TransactionTooLargeException

  

实际上数据大小约为500kb,IPC事务缓冲区大小设置为1024KB。

因此,数据包大小4538408字节(4MB)太大而无法一次发送。拆分它。