Toast异常, Unable to add window --

2019-06-05  本文已影响0人  吉哈达

异常信息:

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

上一篇 下一篇

猜你喜欢

热点阅读