异常信息:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@49f820e 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:94)
at android.widget.Toast$TN.handleShow(Toast.java:434)
at android.widget.Toast$TN$2.handleMessage(Toast.java:345)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
出现环境:
项目中封装的一个toast工具类,来输出toast,当请求的服务器地址是错误的时候,就会出现这个异常。
猜想原因:
由于服务器地址填写错误,项目内有个异常处理类负责处理此类错误操作等等,该类内部中会使当前线程休眠3秒,正是由于这里的休眠导致了UI线程的阻塞,而Toast是系统级别弹窗,其操作是通过ITransientNotification进行对系统发送请求,通过NMS进行具体的控制。
在阻塞的时候,NotificationManager 的超时检测结束,删除了 WMS 服务中的 token 记录,因为安卓的安全机制,弹窗是需要验证token的,这时再显示Toast就会抛出上面的异常信息。
以上toast工作方式只是粗略一谈,有兴趣的可以看这篇文章:https://blog.csdn.net/m0_37700275/article/details/83038714#commentBox
上面链接中也给了三个解决方案。
我的解决方法是:
在子线程中去toast,(这里可以使用cache线程池,保证最低消耗资源。)
网友评论