窗口pipe理器坏标记exception

嗨,我正在面对消息对话框中的问题,越来越强制closures我的代码在这里。

在创build:

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) 

Solutions Collecting From Web of "窗口pipe理器坏标记exception"

当你在对话框上调用show()方法时,看起来exception发生了。 尝试使用下面的代码可能会绕过你的问题:

  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."); } };