随机抛出android.os.TransactionTooLargeException

时间:2014-02-14 20:30:56

标签: android parcelable

我看到我的一个实时应用程序发现了很多错误报告,原因是这个例外:

java.lang.RuntimeException: Adding window failed
   at android.view.ViewRootImpl.setView(ViewRootImpl.java:513)
   at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2852)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
   at android.app.ActivityThread.access$800(ActivityThread.java:135)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5017)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
   at dalvik.system.NativeStart.main(NativeStart.java)

Caused by: android.os.TransactionTooLargeException
   at android.os.BinderProxy.transact(Binder.java)
   at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:683)
   at android.view.ViewRootImpl.setView(ViewRootImpl.java:502)
   at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2852)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2250)
   at android.app.ActivityThread.access$800(ActivityThread.java:135)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5017)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
   at dalvik.system.NativeStart.main(NativeStart.java)

根据我的阅读here,我认为原因可能会过大Parcelable我会添加Intent个额外内容。我正在将一个Object从一个Activity传递给另一个Activity,在对象writeToParcel方法中我保存了一个JSON字符串,其长度范围为1000-1500个字符。这可能是原因吗?

在测试应用程序的同时,我有时会注意到UI滞后,好像内存不足,冻结然后强行关闭。

使用静态变量将Object从一个Activity传递到另一个Activity会不会更好?或者这可能是由其他东西完全引起的?

由于

3 个答案:

答案 0 :(得分:3)

是的,这很可能是由于一个太大的Parcelable,一个太大的对象图形被精确地发送为Parcelable引起的。根据我的经验,如果您正在转移大型图表,那么最好使用Java序列化,这与您在其他地方获得的建议完全相反。公平地说,它比通过Parceler lib使用Parcelable更好,我从未使用过纯Parcelable。有关详细信息,请参阅此主题的my blog post

答案 1 :(得分:1)

根据What to do on TransactionTooLargeException

当您通过意图附加内容传递大量数据时,可能会发生这种情况

如果可能的话,将大操作拆分为小块,例如,不要使用1000个操作调用applyBatch(),而是每个调用100个。

不要在服务和应用程序之间交换大量数据(> 1Mb)

  

1Mb根据http://developer.android.com/reference/android/os/TransactionTooLargeException.html

答案 2 :(得分:1)

你是否覆盖

onSaveInstanceState()

如果您确实检查了要保存的内容,那么也可能会出现错误。 就像你做的那样

outState.putParcelable("key", outState); //Error is passing the bundle
相关问题