Dialog 显示引起的crash

最近工作中遇到一个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();
}

这样,问题就得到解决了。

参考:https://stackoverflow.com/questions/25554279/unable-to-add-window-token-android-os-binderproxy4250d6d8-is-not-valid-is-your

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值