简一_hz 2016-02-17 09:48 采纳率: 48.6%
浏览 3865
已采纳

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;

            }*/

    } 
  • 写回答

4条回答 默认 最新

  • Exploring1024 2016-02-17 12:06
    关注

    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了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试