【问题标题】:How to find out what's causing BadTokenExceptions如何找出导致 BadTokenException 的原因
【发布时间】:2016-08-23 11:36:52
【问题描述】:

我正在开发一个具有多个活动和服务的 Android 应用程序。一些活动是在我导入到我的项目中的第 3 方库中定义的,问题是在某些设备上(特别是在三星 Galaxy Tabs 中)我的应用程序在通过点击背面从一个活动切换到上一个活动时不断崩溃按钮。

我做了一个 LogCat,发现这是导致崩溃的原因:

android.view.WindowManager$BadTokenException: Unable to add window -- token
  android.os.BinderProxy@351c808e is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:562)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

但有趣的是,我的应用程序的所有类都没有出现在堆栈跟踪中。我在 StackOverflow 上搜索了类似的问题,但我发现的所有其他报告都有一个 BadTokenException 的堆栈跟踪,相应应用程序的代码总是出现在堆栈跟踪中。

有谁知道这个问题的常见原因和/或解决问题的最佳方法是什么?我注意到这个问题在三星设备上发生得更多,所以这可能是这些设备上的一个实际错误。

【问题讨论】:

  • 您能否找到问题的原因/解决方法?
  • 是的。问题是我的代码有一个事件监听器,它持有对 TextView 的引用。这个 TextView 的上下文是一个已经被销毁的活动,当监听器试图调用 setText() 时,BadTokenException 被抛出。大多数情况下,这会导致静默失败,但在某些设备上,它会导致 UI 线程抛出异常并使应用程序崩溃。
  • 有趣。您是如何设法将其定位到 setText 的?您是否使用了额外的日志(可能是其他线程的堆栈跟踪?您是否认为您可以发布一些代码/说明如何调试的答案,将不胜感激。谢谢!
  • 我试图重现你提到的场景,有一个按钮引用被破坏活动的过时上下文。当我打电话给setText 时,在这种情况下根本没有效果,但没有崩溃:(
  • 这个问题可能是三星设备特有的。我的 Nexus 4 和 Nexus 7(当时运行 KitKat)没有这个问题,但我的三星 Galaxy Tab 10 和三星 Note 2(也运行 KitKat)会因为这条消息而失败。

标签: android


【解决方案1】:

通常BadTokenExceptions 发生在您的活动尝试在其onAttachToWindow() 方法被调用之前(或在其onDetachFromWindow() 方法被调用之后)创建一个新的Window。很可能是您使用的第三方库有问题,无法确保满足此要求。

【讨论】:

  • 我有非常相同的轨迹(在生产中,不能在本地重现)。您能否推荐一些方法来定位可能导致这种情况的代码/场景?我尝试了 OP 评论中的建议,但没有成功复制它。我真的很想修复它。非常感谢。
猜你喜欢
  • 2010-12-08
  • 2014-01-17
  • 1970-01-01
  • 2013-05-27
  • 2012-09-23
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多