最近工作中遇到一个Crash。 log是如下
--------- beginning of crash
01-14 16:30:43.777 4125 4125 E AndroidRuntime: FATAL EXCEPTION: main
01-14 16:30:43.777 4125 4125 E AndroidRuntime: Process: com.tools.cit, PID: 4125
01-14 16:30:43.777 4125 4125 E AndroidRuntime: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@ac0839d is not valid; is your activity running?
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at android.view.ViewRootImpl.setView(ViewRootImpl.java:769)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at android.app.Dialog.show(Dialog.java:330)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at com.tools.cit.USBTypeCAwayTest.checkUSBPort(USBTypeCAwayTest.java:176)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at com.tools.cit.USBTypeCAwayTest.-wrap1(Unknown Source:0)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at com.tools.cit.USBTypeCAwayTest$1.handleMessage(USBTypeCAwayTest.java:73)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at android.os.Looper.loop(Looper.java:164)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6518)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-14 16:30:43.777 4125 4125 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
01-14 16:30:43.783 694 4119 W ActivityManager: Force finishing activity com.tools.cit/.MagneticCardTest
该场景是要测试USB TypeC设备,前提是没有Type A端口的设备干扰。所以弹出一个提示框,提示拔掉设备。代码中用到了handler的延时发送消息(延时两秒去检查 Type A)。于是就出现了这样的一种情况:打开到当前的Activity的时候,立刻人为地finish掉该Activity。延时两秒的handler还在运行,需要弹出提示框的时候原来的Activity已经不在了,于是dialog.show()就有了问题。
解决办法:这里有一个最简单的办法,只需要在dialog.show() 之前添加条件:!isFinishing() 。代码如下
if (!isFinishing()) {
mDialog.show();
}
这样,问题就得到解决了。