首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unable to add window --token is not valid

Unable to add window --token is not valid

作者头像
再见孙悟空_
发布2023-02-10 19:10:05
3500
发布2023-02-10 19:10:05
举报

Process: com.android.******

Flags: 0x9be65

Package: com.android.*** v15 (4.0.4)

Build: ***:4.0.4/IMM76D/1348165925:eng/test-keys

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41791b20 is not valid; is your activity running?

at android.view.ViewRootImpl.setView(ViewRootImpl.java:546)

at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:302)

at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:216)

at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:141)

at android.view.Window$LocalWindowManager.addView(Window.java:537)

at android.app.Dialog.show(Dialog.java:278)

at android.app.AlertDialog$Builder.show(AlertDialog.java:991)

.

at android.widget.TextView.onTouchEvent(TextView.java:8430)

at android.view.View.dispatchTouchEvent(View.java:5553)

at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2027)

.

at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2027)

at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1762)

at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)

at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1397)

at android.app.Activity.dispatchTouchEvent(Activity.java:2431)

at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)

at android.view.View.dispatchPointerEvent(View.java:5733)

at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3112)

at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2666)

at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:900)

at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2675)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loop(Looper.java:154)

at android.app.ActivityThread.main(ActivityThread.java:4651)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:511)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)

at dalvik.system.NativeStart.main(Native Method)

1,错误分析:

从错误信息我们也可以明白其原因,此问题根本原因就是由于将要弹出的dialog所要依附的View已经不存在导致的。

2,什么地方可能照成此问题:当界面销毁后再弹出来;或者界面跳转时我们的view发生改变,dialog依附的context发生变化或者界面未运行了。

此外,很多时候我们需要通过一个非组件类来调用一个view类的方法来弹出dialog或Toast,这样就需要再提供一个静态context来创建这个dialog或者Toast

例如我们在一个view中通过一个静态类来弹出一个对话框:AlertDialog.Builder builder = new AlertDialog.Builder(mContextNew);当然并不是所有静态context都是可以用来创建dialog的,例如***App().getApplication().getApplicationContext()这个context就不行,因为它并不代表哪一个Activity或者View。。这样就无法add这个dialog。

此view用于绑定显示数据,我们在其构造方法中初始化一个静态变量mContextNew为此view的mContext。这样我们就可以通过一个静态类来弹出对话框了,只需传入这个静态的context(mContextNew)就可以了。。但是这个静态的context如果只在构造方法中初始化的话是会存在问题的,因为如果另起了一个界面其绑定数据的view也是用的这个view那么这个静态context就会被重新修改。。因此当这个新的界面finish后返回到上次的界面,这个静态的context是刚才已经finish的view的context。因此如果仍然传入这个静态变量通过一个静态类来弹出对话框就会出现上述找不到window的错误了。

解决办法:

对于tab页出现的错误可以用其父类的context来弹出dialog;对于界面已经销毁引起的错误就只能判断界面是否存在然后再弹出了;对于利用静态context来弹出的dialog可以通过规避的方式来解决,比如避免出现静态context被修改。。但是这样就可能限制了我们程序的功能。。因此我们可以通过在bind数据时时时更新这个静态context就可以解决此问题了,这样就可以保证这个静态的context在任何view中都是当前的界面的view的context。就不会出现找不到其父类window了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档