最近在解决项目时,需要使用蓝牙打印机打印SKU,然后运行App时出现了以下报错。

android.view.WindowManager$BadTokenException: 
Unable to add window -- token android.os.BinderProxy@d0f9fcf is not valid; is your activity running?
         at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
         at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
         at android.widget.Toast$TN.handleShow(Toast.java:459)
         at android.widget.Toast$TN$2.handleMessage(Toast.java:342)
         at android.os.Handler.dispatchMessage(Handler.java:102)
         at android.os.Looper.loop(Looper.java:154)
         at android.app.ActivityThread.main(ActivityThread.java:6157)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)

在每次打印时候如果调用打印机状态 时间较长时,则会出现当前报错信息,通过报错日志可以看到当前报错信息由于Activity 销毁后 弹出Toast导致报错 ,尝试通过try catch 进行 捕捉异常 发现还是不行 。
出现问题的版本是Android 7.1 系统

搜索发现 7.1系统对Toast的window类型做了超时限制,绑定window token,最长超时时间为3.5s,如果UI这段时间内没有执行完任务,toast.show()内部的handle message得不到执行,系统就会把次toast取消掉,并同时把window token设置为无效,等需要显示时,则抛出此异常。