Android.os.TransactionTooLargeException выбрано случайно

Я вижу довольно много сообщений об ошибках из одного из моих живых приложений, вызванное это исключение:

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. В настоящее время я передаю объект из одного действия в другое, в этом объекте writeToParcel я сохраняю строку JSON, которая имеет размер от 1000 до 1500 символов. Может ли это быть причиной?

Во время тестирования приложения я иногда замечаю, что пользовательский интерфейс отстает, как будто он мал по памяти, замерзает, а затем принудительно закрывает.

Было бы лучше передать объект из одной операции в другую с помощью статических переменных или это может быть вызвано чем-то другим?

Спасибо

Ответ 1

Да, это очень хорошо может быть вызвано слишком большим Parcelable, слишком большим графом объектов, который будет отправлен как Parcelable, если быть точным. По моему опыту вам лучше использовать серию java, если вы переносите большой график, и это в значительной степени противоположно советам, которые вы получите в другом месте на SO и вообще. Чтобы быть справедливым это лучше, чем использование Parcelable через Parceler lib, я никогда не использовал чистый Parcelable. Для более подробной информации см. мой пост в блоге на эту тему.

Ответ 2

в соответствии с Что делать с TransactionTooLargeException:

Это может произойти, когда вы передаете много данных с помощью дополнительных настроек

Если возможно, разделите большую операцию на маленькие куски, например, вместо вызова applyBatch() с 1000 операций, вызовите его по 100.

Не обменивайте огромные данные ( > 1Mb) между сервисами и приложением

1Mb По http://developer.android.com/reference/android/os/TransactionTooLargeException.html

Ответ 3

Вы переопределяете

onSaveInstanceState()

если вы проверяете, что вы сохраняете, также может быть ошибка. Например, если вы делаете

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