昨天测试时发现这个BUG,当时我也很好奇这个问题是,怎样产生的。我打开错误日志看见是这样提示的。
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@2cd9157b is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:676)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:288)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.app.Dialog.show(Dialog.java:312)
at com.mx.study.view.Loading$1.handleMessage(Loading.java:63)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
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:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
这也是我第一次遇见这个异常,我感觉很诡异,有时会出现,有时又不出现。这个就有点蛋痛了。查询了资料。
异常的大概意思 :android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null是无效的; 为您的活动运行?
1.这里主要说的是你的android里一个Activity发生窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏,
主要是你的打开一个PopupWindow(窗体)时,如图。它没有关闭PopupWindow(窗体),就退出这个Activity,就会发生这个错误,
因为这里就有一个顺序,你要先关闭PopupWindow,再关闭Activity,这个一定的,PopupWindow(窗体)不能独立存在。
2.明白这个,你就容易解决了,你先用(dismiss)关闭就行,在你的窗体需要关闭时,加上这句:
(PopupWindow.dismiss;)PopupWindow这个是你项目里你窗体的名字。最好做一个判断,判断窗体是否为空,如果不为空就关闭,不然有时空也关闭也会出错。
大概出现的情景是这样的:我上一个Activity里面滑动的时候突然,闪了一下。我知道这个肯定出现BUG,但是当前界面的Activity并没用到,WindowManager 和弹窗。我想是不是我之前没有关闭上一个Activity的弹窗。
于是我在代码中是这样写的。
if(chaptersWindow!=null){
chaptersWindow.dismiss();
}
if(popupWindowSelect!=null){
popupWindowSelect.dismiss();
}
finish();
最后就没有出现这个异常,第一次遇见这个异常,记一下是怎样解决的。希望对大家有帮助。