Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 窗口管理器错误令牌异常_Android_Android Alertdialog - Fatal编程技术网

Android 窗口管理器错误令牌异常

Android 窗口管理器错误令牌异常,android,android-alertdialog,Android,Android Alertdialog,嗨,我在消息对话框中遇到了一个问题,强制关闭我的代码在这里 在“创建时”中: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.email_result); email_result = (Button) findViewById(R.id.email_result_btn); email_

嗨,我在消息对话框中遇到了一个问题,强制关闭我的代码在这里

在“创建时”中:

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.email_result);

    email_result = (Button) findViewById(R.id.email_result_btn);
    email_result.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            if (diffdays > 365) {

                h.sendEmptyMessage(0);
              }
         }
     }
  }
我的经纪人:

private Handler h = new Handler() {
    public void handleMessage(Message msg) {
           showMessageDialog("Sorry, you cannot email entries which are earlier than one year ago.");
    }
};
ShowMessageDialog方法:

public void showMessageDialog(String nMessage) {

    alertDialog = new Dialog(Email_Result.this);
    AlertDialog.Builder customBuilder = new AlertDialog.Builder(
            Email_Result.this);
    customBuilder.setMessage(nMessage);
    customBuilder.setPositiveButton(getString(R.string.ok),
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    alertDialog.dismiss();
                }
            });
    alertDialog = customBuilder.create();
    alertDialog.setCancelable(true);
    alertDialog.show();
}
错误日志

01-11 12:08:24.470: ERROR/AndroidRuntime(325): FATAL EXCEPTION: main
01-11 12:08:24.470: ERROR/AndroidRuntime(325): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@44f1dfd8 is not valid; is your activity running?
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.view.ViewRoot.setView(ViewRoot.java:505)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.app.Dialog.show(Dialog.java:241)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at com.stress1.Email_Result.showMessageDialog(Email_Result.java:207)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at com.stress1.Email_Result$2.onClick(Email_Result.java:81)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.view.View.performClick(View.java:2408)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.view.View$PerformClick.run(View.java:8816)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.os.Handler.handleCallback(Handler.java:587)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.os.Looper.loop(Looper.java:123)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at java.lang.reflect.Method.invokeNative(Native Method)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at java.lang.reflect.Method.invoke(Method.java:521)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-11 12:08:24.470: ERROR/AndroidRuntime(325):     at dalvik.system.NativeStart.main(Native Method)

在对话框上调用show()方法时,似乎会发生异常。尝试使用以下代码,这可能会绕过您的问题:

 try {
      alertDialog.show();
 } catch(Exception e){
   // WindowManager$BadTokenException will be caught and the app would not display 
   // the 'Force Close' message
 }
当活动在终止后试图显示AlertDialog时,就会出现这种问题。因此,您可能需要仔细查看代码的工作方式

此外,您的showMessageDialog方法可以简化如下:

public void showMessageDialog(String nMessage) {

    AlertDialog.Builder customBuilder = new AlertDialog.Builder(Email_Result.this);
    customBuilder.setMessage(nMessage);
    customBuilder.setPositiveButton(getString(R.string.ok),new DialogInterface.OnClickListener(){
         @Override            
         public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
         }
    });
    customBuilder.setCancelable(true);
    customBuilder.show();
}
只需在代码中添加if(!isFinishing),如下所示:

private Handler h = new Handler() {
    public void handleMessage(Message msg) {
            if(!isFinishing)
           showMessageDialog("Sorry, you cannot email entries which are earlier than one year ago.");
    }
};

使用以下命令,您将不会得到
致命异常:android.view.WindowManager$BadTokenException
异常

if(!Email_Result.this.isFinishing())
{
        customBuilder.show();
}
如果您有一个
上下文
,则可以使用以下内容:

if(!((Activity) context).isFinishing())
{
        customBuilder.show();
}

请发布日志,此错误通常发生在您使用
ActivityGroup
为什么使用处理程序显示对话框时。您也可以从onclick调用showMessageDialog。在这段代码中,handler的用途是什么?请检查这个链接,为什么我们的类中需要处理程序。我在没有处理程序的情况下也尝试过,但也遇到了相同的错误。请参阅我的错误,并在回复中回答:“当活动在终止后试图显示AlertDialog时,会出现这样的问题。”。。。正如我发现的,当使用“new AlertDialog.Builder(myActivity.getApplicationContext())”构建myAlertDialog.show()时,WindowManager.BadTokenException也可以在myAlertDialog.show()上引发。解决方案分为两步:1-对myActivity进行应用程序范围的静态单例引用,2-将myActivity用作构建器上下文。@TomPace-您在那里遇到了不安全的情况,因为对上下文进行静态引用必然会泄漏内存。此外,我没有看到解决方案背后的合理原因。当我使用析构函数类型代码“myStaticRef=null;”时,泄漏的可能性有多大?我已经有一段时间没有处理Java内存了,假设垃圾收集工作正常。但是,我熟悉C和Obj-C中的内存管理技术。不过,我需要知道。请通知我!垃圾收集在Java中有点难理解。我不是Java专家,但据我所知,取消引用并不能保证对象会立即被垃圾收集。正如您已经知道的,C和Obj-C提供了对内存分配的更多控制。StackOverflow上有几个线程禁止使用对
上下文的静态引用。您可能会通过使用静态
上下文
引用获得,但您可能会在某些时候遇到难以追踪的问题。另外,你应该读一下——这是我问题的答案,谢谢:)