美文网首页
Toast异常, Unable to add window --

Toast异常, Unable to add window --

作者: 吉哈达 | 来源:发表于2019-06-05 16:28 被阅读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线程池,保证最低消耗资源。)

    相关文章

      网友评论

          本文标题:Toast异常, Unable to add window --

          本文链接:https://www.haomeiwen.com/subject/zrlsxctx.html