2011-07-01 29 views
10

Tôi gặp sự cố khi tôi nhận được BadTokenException khi màn hình hết thời gian chờ và sau đó người dùng quay lại ứng dụng của tôi. Tôi có một nút mở ra ContextMenu khi được nhấp.BadTokenException: Không thể thêm cửa sổ

Nó hoạt động bình thường, nhưng khi người dùng để màn hình hết thời gian chờ và sau đó quay trở lại ứng dụng, một số BadTokenException bị ném.

07-01 14:46:42.763: WARN/WindowManager(1105): Attempted to add window with token that is a sub-window: [email protected] Aborting. 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.View.showContextMenu(View.java:2444) 
    07-01 14:46:42.771: WARN/System.err(1725):  at com.??.??.ui.cards.ViewActivity$3.onClick(ViewActivity.java:353) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.View.performClick(View.java:2408) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.view.View$PerformClick.run(View.java:8816) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.os.Handler.handleCallback(Handler.java:587) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.os.Handler.dispatchMessage(Handler.java:92) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.os.Looper.loop(Looper.java:123) 
    07-01 14:46:42.771: WARN/System.err(1725):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
    07-01 14:46:42.771: WARN/System.err(1725):  at java.lang.reflect.Method.invokeNative(Native Method) 
    07-01 14:46:42.771: WARN/System.err(1725):  at java.lang.reflect.Method.invoke(Method.java:521) 
    07-01 14:46:42.771: WARN/System.err(1725):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    07-01 14:46:42.771: WARN/System.err(1725):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    07-01 14:46:42.771: WARN/System.err(1725):  at dalvik.system.NativeStart.main(Native Method) 
    07-01 14:46:43.005: WARN/System.err(1725): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewRoot.setView(ViewRoot.java:505) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.app.Dialog.show(Dialog.java:241) 
    07-01 14:46:43.005: WARN/System.err(1725):  at com.android.internal.view.menu.MenuDialogHelper.show(MenuDialogHelper.java:86) 
    07-01 14:46:43.005: WARN/System.err(1725):  at com.android.internal.view.menu.ContextMenuBuilder.show(ContextMenuBuilder.java:88) 
    07-01 14:46:43.005: WARN/System.err(1725):  at com.android.internal.policy.impl.PhoneWindow$DecorView.showContextMenuForChild(PhoneWindow.java:1860) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 
    07-01 14:46:43.005: WARN/System.err(1725):  at android.view.ViewGroup.showContextMenuForChild(ViewGroup.java:459) 

Nếu tôi bắt ngoại lệ, nút không bao giờ mở contextmenu trong trường hợp này, nhưng các điều khiển khác trên trang tiếp tục hoạt động.

Nếu tôi hạn chế tối đa các ứng dụng với màn hình chủ, và sau đó trở lại, các ứng dụng bị treo với dấu vết sau:

07-01 15:10:50.439: ERROR/AndroidRuntime(1931): FATAL EXCEPTION: main 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931): java.lang.NullPointerException 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.view.WindowManagerImpl.removeViewLocked(WindowManagerImpl.java:239) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.view.WindowManagerImpl.closeAll(WindowManagerImpl.java:293) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3687) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread.access$2900(ActivityThread.java:125) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.os.Looper.loop(Looper.java:123) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-01 15:10:50.439: ERROR/AndroidRuntime(1931):  at dalvik.system.NativeStart.main(Native Method) 

Đây là cách tôi thêm ContextMenu:

b.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (contextMenuOpen) return;// popup options 
       contextMenuOpen = view.showContextMenu(); 

      } 

tôi không gọi registerForContextMenu bằng nút, mà đúng hơn là chính chế độ xem chính. Điều này có đúng không?

Trả lời

13

Bạn đang giữ một tham chiếu đến Ngữ cảnh (hoặc rõ ràng hoặc bằng cách tạo Hộp thoại hoặc Bánh mì nướng hoặc một số mục phụ thuộc khác) đã bị hủy (thường là vì bạn đang sử dụng onCreateDialog hoặc bạn đã chuyển Hoạt động cho một số quá trình khác không bị phá hủy khi Activity bị phá hủy).

+0

Cảm ơn phản hồi của bạn. Bạn có nhớ xem bản chỉnh sửa của tôi cho bài đăng gốc và đảm bảo rằng bài đăng đó hợp lệ không? Tôi nhận được một tham chiếu hợp lệ cho View trong hàm onClick. –

+0

Điều đó thực sự không đủ để nói những gì bạn đang làm sai: sẽ thực sự cần phải xem xét nhiều mã của bạn hơn để xác định chi tiết cụ thể. Những gì bạn có thể thử là di chuyển cuộc gọi 'setOnClickListener' vào cuộc gọi lại' onResume' cho Hoạt động (đảm bảo bạn cũng đang gọi phương thức siêu lớp khi bạn ghi đè 'onResume') và xem liệu bạn có gặp sự cố không. – Femi

+0

Tôi đã quyết định giải quyết vấn đề này ngay bây giờ, thông qua một tuyến đường khác có thể không áp dụng cho bất kỳ ai khác và không thực sự khắc phục vấn đề, vì vậy tôi sẽ không giải thích vấn đề ở đây. Cảm ơn –

0

Khi tôi gọi phương thức showContextMenu() chỉ đơn giản là trong trênResume Tôi đã bắt được cùng một Ngoại lệ. Tôi đã giải quyết vấn đề này bằng cách sử dụng Handler

@Override 
protected void onResume() { 
    super.onResume(); 

    if (contextMenuOpened) { 
     new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       choosePicBtn.showContextMenu(); 
      } 
     }); 
    } 
} 
Các vấn đề liên quan