Android程序报错:Unable to add window——token android.os.BinderProxy@431e65b8 is not valid
2016-06-07 16:34
417 查看
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的错误了。
3、解决办法:
对于tab页出现的错误可以用其父类的context来弹出dialog;对于界面已经销毁引起的错误就只能判断界面是否存在然后再弹出了;对于利用静态context来弹出的dialog可以通过规避的方式来解决,比如避免出现静态context被修改。。但是这样就可能限制了我们程序的功能。。因此我们可以通过在bind数据时时时更新这个静态context就可以解决此问题了,这样就可以保证这个静态的context在任何view中都是当前的界面的view的context。就不会出现找不到其父类window了。
相关文章推荐
- NotificationListenerService使用总结笔记
- The Import android.support.v7 cannot be resolved
- Android 基础总结:( 十八)Permission详解(上)
- [Android] 给 Linearlayout 添加边框
- Android动态加载进阶 代理Activity模式
- android出现注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注
- Android 沉浸式状态栏的实现方法、状态栏透明
- Android导出jar包和之后的资源使用问题
- apk上传到应用市场时出现解析失败
- Android知识梳理之屏幕适配全攻略
- android 自定义标题栏
- Android 官方文档导读(Introduction)
- 如何创建Android Studio工程的git本地仓库——初级篇
- Android_SQLite数据库存储
- Android 复制显示悬浮窗和点击悬浮窗打开应用
- Android VelocityTracker简介
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android内存泄漏终极解决篇
- android获取友盟渠道名
- android ndk编译错误