随机抛出android.os.TransactionTooLargeException

我从我的一个实时应用程序中看到了很多错误报告,原因是这个exception:

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) 

从我在这里读到的,我相信原因可能是一个太大的Parcelable我正在添加一个Intent附加function。 我目前正在将一个Object从一个Activity传递给另一个Activity,其中对象writeToParcel方法我正在保存一个JSON字符串,其长度范围为1000-1500个字符。 这可能是原因吗?

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

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

谢谢

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

根据TransactionTooLargeException做什么 :

当您通过intent extras传递大量数据时,可能会发生这种情况

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

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

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

你改写了吗?

 onSaveInstanceState() 

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

 outState.putParcelable("key", outState); //Error is passing the bundle