问题描述
- Unable to add window--is your activity running?
-
android 判断网络连接问题,网络连接不上的时候弹出提示框;问题是退出应用再一次进入时应用就直接挂掉了;报错:android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4255c7e0 is not valid; is your activity running?
代码见下面;注销掉部分是我尝试解决的方法,但这样做的问题是第二次Dialog好像会不出现,或者就是隔很久很久才出现(导致我以为没有出现。。)反正就是有问题,能百度到的方法都试了,不行。。求大神帮忙/** * 网连接超时提示 */ private void netTimeOut(){ AlertDialog.Builder builder3 =new AlertDialog.Builder(MainActivity.this); builder3.setTitle(R.string.dia_title); builder3.setMessage(log_no); builder3.setNegativeButton(R.string.dia_retry, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { arg0.dismiss(); MainActivity.this.finish(); restartApplication(); } }); builder3.setPositiveButton(R.string.dia_exit, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { arg0.dismiss(); ActivityManag.avtivityClose(); } }); builder3.create().show(); /*if(this.isTaskRoot()) { builder3.create().show(); } else { builder3 = null; }*/ }
解决方案
is your activity running?对于new AlertDialog.Builder(MainActivity.this);中你的MainActivity是否已经启动,然后再弹出对话框,不然对话框没有
依附,所以报错。
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了。
解决方案二:
求积分求积分求积分求积分求积分
解决方案三:
额。。。你能解决这个问题吗?