2014-02-14 3 views
11

я вижу довольно много отчетов об ошибках от одного из моих живых приложений, вызываемый это исключение: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) 

Из того, что я прочитал here, я считаю, что причина может быть до слишком большого Parcelable Я добавляю к дополнительным Intent. Я в настоящее время передаю объект из одного действия в другое, в этом объекте writeToParcel метод Я сохраняю строку JSON, которая имеет размер от 1000 до 1500 символов. Может ли это быть причиной?

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

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

Благодаря

ответ

3

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

1

по What to do on TransactionTooLargeException:

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

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

Не заменяйте больших объемов данных (> 1Mb) между службами и приложением

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

+1

я думаю, что предел 1Mb –

+0

@Arash -О! - Я думаю, вы сказали правильно - согласно этому источнику: http://developer.android.com/reference/android/os/TransactionTooLargeException.html – Saeid

+0

Хороший ответ, но в следующий раз процитируйте текст, который вы копируете 1: 1. – JacksOnF1re

1

ли вы переопределить

onSaveInstanceState() 

если проверить, что вы спасаете также может быть ошибка. Как если вы

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