Android: добавление окна не удалось /android.os.TransactionTooLargeException на устройствах Samsung

С тех пор, как через пару месяцев у меня появилось большое количество исключений в моем приложении с сообщением об ошибке: Ошибка добавления окна (android.os.TransactionTooLargeException)

Я знаю, что размер транзакции буфера IPC ограничен 1024 КБ, но я просто отправляю идентификаторы на свой сервис (длинное значение). Странно то, что эти исключения происходят только на устройствах Samsung с Android 4.4.2 (каждый из более чем 50K сбоев). Знаете ли вы конкретную ошибку в последнем Samsung ROM?

    java.lang.RuntimeException: Adding window failed
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:738)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.widget.Toast$TN.handleShow(Toast.java:478)
       at android.widget.Toast$TN$1.run(Toast.java:374)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:5476)
       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:1268)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
       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:710)
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:727)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.widget.Toast$TN.handleShow(Toast.java:478)
       at android.widget.Toast$TN$1.run(Toast.java:374)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:5476)
       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:1268)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
       at dalvik.system.NativeStart.main(NativeStart.java)

или

    java.lang.RuntimeException: Adding window failed
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:726)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3038)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)
       at android.app.ActivityThread.access$900(ActivityThread.java:161)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:157)
       at android.app.ActivityThread.main(ActivityThread.java:5356)
       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:1265)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
       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:710)
       at android.view.ViewRootImpl.setView(ViewRootImpl.java:715)
       at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278)
       at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
       at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3038)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)
       at android.app.ActivityThread.access$900(ActivityThread.java:161)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:157)
       at android.app.ActivityThread.main(ActivityThread.java:5356)
       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:1265)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
       at dalvik.system.NativeStart.main(NativeStart.java)

Ответ 1

Пожалуйста, проверьте ответ здесь при переполнении стека.

Durairaj Packirisamy ответил на тот же вопрос о ошибке TransactionTooLarge, которая ниже.

Durairaj Packirisamy говорит: -

Я столкнулся с этой проблемой, и я обнаружил, что когда между сервисом и приложением происходит обмен огромным количеством данных (это связано с переносом большого количества миниатюр). Фактически размер данных составлял около 500 кбайт, а размер буфера транзакций IPC установлен равным 1024 КБ. Я не уверен, почему он превысил буфер транзакции.

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

Когда вы получите это исключение в своем приложении, проанализируйте свой код.

Вы обмениваете много данных между вашими услугами и приложением? Используя намерения обмениваться огромными данными (например, пользователь выбирает огромное количество файлов из общей папки общего доступа к общей папке, URI выбранных файлов будут переданы с использованием намерений) получение растровых файлов из службы ожидая андроида, чтобы ответить огромными данными (например, getInstalledApplications(), когда пользователь установил много приложений) с помощью applyBatch() с множеством ожидающих операций Как обращаться, когда вы получаете это исключение

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

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

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


Me: - Недавно я также столкнулся с этой проблемой. Моя проблема была в том, что я копировал видео из исходной папки на SD-карту, а затем создавал ее миниатюру и после нее показывал в виде списка. Весь этот процесс выполнялся в одиночном потоке, и было исключено исключение. Я решил эту проблему, разделив весь процесс копирования видео из исходной папки на SD-карту, создав палец ногтя и показывая по списку. Все эти действия были выполнены на 3 разных потоках, и моя проблема была решена.

Пожалуйста, дайте мне знать, если это поможет вам.

Ответ 2

Я также получил TransactionTooLargeException на устройствах Samsung. Я передавал слишком большие html-данные в намерениях, но теперь я решил это, уменьшив огромные данные.

Когда вы получили исключение TransactionTooLargeException в своем приложении, проверьте свой код. Избегайте огромных данных в дополнительных целях.