【问题标题】:Android: Adding window failed / android.os.TransactionTooLargeException on Samsung devicesAndroid:在三星设备上添加窗口失败/android.os.TransactionTooLargeException
【发布时间】:2014-10-15 15:07:05
【问题描述】:

几个月以来,我的应用程序中出现大量异常并显示错误消息:添加窗口失败 (android.os.TransactionTooLargeException)

我知道 IPC 缓冲区事务大小限制为 1024KB,但我只是将 id 发送到我的服务(长值)。 奇怪的是,这些异常只发生在装有 Android 4.4.2 的三星设备上(超过 50K 崩溃中的每一个)。 您知道最新的三星 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)

【问题讨论】:

  • 这来自您或某人正在展示的Toast。你有没有显示任何Toasts?有比短字符串更复杂的吗?
  • 是的,我在一些 Toast 消息中使用了一些 SpannableString 内容: SpannableString span = new SpannableString(builder.toString()); if (!isEmptyErrorMessage) { span.setSpan(new ForegroundColorSpan(this.service.getResources().getColor(R.color.orange_logo)), pos, builder.toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); span.setSpan(new StyleSpan(Typeface.BOLD), pos, builder.toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } 但结果不超过 200 个字符
  • 事实上,我添加了第二个堆栈跟踪,它比第一个更频繁地发生。仍然只在三星设备上......
  • "您知道最新的三星 ROM 中的特定错误吗?"你已经在统计上证明了存在一个。 - 据我了解,1MB 事务缓冲区必须在事务未完成时保持所有数据缓冲,例如这种情况:stackoverflow.com/a/16895870/995891。因此,也许这些设备上的某些东西没有正确清理,只留下比平时更小的缓冲区,而您的应用恰好使用了更多。尽管 IPC 缓冲区可能在本机代码中,但可能有机会通过堆转储查看使用缓冲区的内容。
  • 你的问题到底是什么?

标签: android exception


【解决方案1】:

请在堆栈溢出时检查here 提供的答案。

Durairaj Packirisamy 回答了以下 TransactionTooLarge 错误的相同问题。

Durairaj Packirisamy 说:-

我遇到了这个问题,我发现当服务和应用程序之间交换大量数据时,(这涉及传输大量缩略图)。实际数据大小约为 500kb,IPC 事务缓冲区大小设置为 1024KB。我不确定为什么它超出了事务缓冲区。

当您通过 Intent Extras 传递大量数据时,也会发生这种情况

当您在应用程序中遇到此异常时,请分析您的代码。

您是否在服务和应用程序之间交换大量数据? 使用意图共享海量数据,(例如,用户从图库共享新闻共享中选择大量文件,所选文件的URI将使用意图传输) 从服务接收位图文件 等待 android 响应大量数据(例如,当用户安装大量应用程序时,getInstalledApplications()) 使用 applyBatch() 有很多操作挂起 遇到此异常时如何处理

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

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

我不知道怎么做,但是,不要查询android,它会返回大量数据:-)


:- 最近我也遇到了这个问题。我的问题是我将视频从原始文件夹复制到 sd 卡,然后创建它的缩略图,然后它显示在列表视图中。这整个过程是在单线程上执行的,并且抛出了异常。我通过分离将视频从原始文件夹复制到 sdcard、创建缩略图和显示在列表中的整个过程来解决这个问题。这些所有操作都在 3 个不同的线程上执行,我的问题得到了解决。

如果对你有帮助,请告诉我。

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      我在三星设备上也遇到了 TransactionTooLargeException。 我在 Intent Extras 中传输了过多的 html 数据,但现在我通过减少大量数据来解决这个问题。

      当您的应用程序中出现 TransactionTooLargeException 异常时,请检查您的代码。 避免在 Intent Extras 中使用大量数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多