Toast异常, Unable to add window -- token ..... is not valid; is your activity running?

异常信息:

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线程池,保证最低消耗资源。)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容