如何找出导致BadTokenExceptions的原因

9

我正在开发一款涉及多个活动和服务的Android应用程序。其中一些活动是在第三方库中定义的,我正在将其导入到我的项目中。问题在于,在某些设备上(特别是三星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的堆栈跟踪中,相应的应用程序代码总是出现在堆栈跟踪中。

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


你能找到问题的原因/解决方法了吗? - kiruwka
1
是的。问题在于我的代码有一个事件监听器,它持有对TextView的引用。这个TextView的上下文是一个已经被销毁的活动,当监听器尝试调用setText()时,就会抛出BadTokenException异常。大多数情况下,这会导致静默失败,但在某些设备上,它会导致UI线程抛出异常并崩溃应用程序。 - user4118620
我尝试重现您提到的场景,即按钮引用已过时的销毁活动上下文。当我调用setText时,在这种情况下它根本没有效果,但不会崩溃 :( - kiruwka
我也遇到了相同的logcat,但我无法重现。请问有人能告诉我可能的原因吗? - Sunit Kumar Gupta
查看我的答案:https://dev59.com/hG025IYBdhLWcg3wsIIU#39091647 对我来说很有效。 - Matrixxun
显示剩余3条评论
1个回答

0
通常情况下,当您的活动在其onAttachToWindow()方法被调用之前(或在其onDetachFromWindow()方法被调用后)尝试创建新的Window时,会出现BadTokenExceptions。很可能是您正在使用的第三方库存在缺陷,未能确保满足此要求。

1
我遇到了非常相似的堆栈跟踪(在生产环境中,本地无法重现)。你能否推荐一些方法来定位可能导致这个问题的代码/场景?我尝试了OP评论中的建议,但没有成功重现它。我真的很想修复它。非常感谢。 - kiruwka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接