2012-01-10 27 views
8

Xin chào, tôi đang gặp phải sự cố trong hộp thoại Tin nhắn, việc lấy mã Đóng mã của tôi ở đây.ngoại lệ mã thông báo lỗi trình quản lý cửa sổ

ở trên tạo:

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

Handler của tôi:

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

ShowMessageDialog Phương pháp:

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(); 
} 

Lỗi Log

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 [email protected] 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) 
+1

xin vui lòng đăng ** LogCat **, lỗi này thường xảy ra khi bạn đang sử dụng 'ActivityGroup' –

+0

Tại sao bạn đang sử dụng trình xử lý để hiển thị hộp thoại của bạn. bạn có thể gọi showMessageDialog từ onclick của bạn. việc sử dụng trình xử lý trong mã này là gì? Vui lòng kiểm tra liên kết này tại sao chúng ta cần xử lý trong lớp của chúng tôi. http://developer.android.com/reference/android/os/Handler.html –

+0

Tôi đã thử mà không cần Handler nhưng cũng gặp lỗi tương tự, hãy xem lỗi của tôi cũng –

Trả lời

25

Dường như ngoại lệ xảy ra khi bạn gọi phương thức show() trên Hộp thoại. Hãy thử sử dụng mã sau đây có thể phá vỡ sự cố của bạn:

try { 
     alertDialog.show(); 
} catch(Exception e){ 
    // WindowManager$BadTokenException will be caught and the app would not display 
    // the 'Force Close' message 
} 

Vấn đề như vậy phát sinh khi hoạt động đang cố gắng hiển thị AlertDialog sau khi nó đã bị chấm dứt. Vì vậy, bạn có thể muốn xem xét kỹ cách mã của bạn hoạt động.

Ngoài ra, phương pháp showMessageDialog của bạn có thể được đơn giản hóa như sau: (! IsFinishing)

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(); 
} 
+2

để trả lời: "Vấn đề như vậy phát sinh khi hoạt động đang cố gắng hiển thị AlertDialog sau khi nó đã bị chấm dứt. " ... WindowManager.BadTokenException cũng có thể được ném, như tôi đã phát hiện, trên myAlertDialog.show() khi nó được xây dựng bằng cách sử dụng "AlertDialog.Builder mới (myActivity.getApplicationContext())". Giải pháp là hai bước: 1- tạo một tham chiếu đơn lẻ tĩnh ứng dụng tới myActivity, 2- sử dụng myActivity làm bối cảnh Builder. –

+2

@TomPace - Bạn đang giẫm lên các vùng nước không an toàn ở đó vì có một tham chiếu tĩnh đến một ngữ cảnh bị ràng buộc làm rò rỉ bộ nhớ. Bên cạnh đó, tôi không thấy lý do âm thanh đằng sau giải pháp. – Abhijit

+0

Khả năng rò rỉ là gì khi tôi sử dụng mã loại phá hủy "myStaticRef = null;" ? Đã một thời gian kể từ khi tôi xử lý bộ nhớ Java, giả sử rằng bộ sưu tập rác đã hoạt động. Nhưng, tôi quen thuộc với các kỹ thuật quản lý bộ nhớ từ C và Obj-C. Tuy nhiên, tôi cần phải nhận thức được. Vui lòng thông báo! –

4

Chỉ cần thêm nếu trong mã của bạn như thế này:

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

đây là giải pháp cho câu hỏi của tôi, cảm ơn bạn :) http: // stackoverflow .com/questions/24467391/android-progressdialog-show-windowmanager-token-không hợp lệ –

Các vấn đề liên quan