2011-10-18 25 views
83

lỗi này là gì ... tôi đã không tìm thấy bất kỳ cuộc thảo luận về lỗi này trong cộng đồng stackoverflow chi tiết: -Lỗi: BinderProxy @ 45d459c0 không hợp lệ; hoạt động của bạn có đang chạy không?

10-18 23:53:11.613: ERROR/AndroidRuntime(3197): Uncaught handler: thread main exiting due to uncaught exception 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.ViewRoot.setView(ViewRoot.java:468) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.app.Dialog.show(Dialog.java:239) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at com.vishal.contacte.Locationlistener$MyLocationListener.onLocationChanged(Locationlistener.java:86) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:179) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:112) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:128) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.os.Looper.loop(Looper.java:123) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at java.lang.reflect.Method.invoke(Method.java:521) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
10-18 23:53:11.658: ERROR/AndroidRuntime(3197):  at dalvik.system.NativeStart.main(Native Method) 
+0

Bản sao có thể có của [Không thể thêm cửa sổ - mã thông báo android.os.BinderProxy không hợp lệ; hoạt động của bạn đang chạy?] (https: // stackoverflow.com/questions/9529504/không thể thêm cửa sổ-mã thông báo-android-os-binderproxy-is-không-hợp lệ-là-bạn-kích hoạt) – Pod

Trả lời

214

này rất có thể là xảy ra vì bạn đang cố gắng hiển thị hộp thoại sau khi thực hiện chuỗi nền, trong khi Hoạt động đang bị hủy.

Tôi đã nhìn thấy lỗi này được báo cáo một lần trong một thời gian từ một số ứng dụng của tôi khi hoạt động gọi hộp thoại hoàn tất vì một số lý do hoặc cách khác khi cố gắng hiển thị hộp thoại. Dưới đây là những gì đã giải quyết cho tôi:

if(!((Activity) context).isFinishing()) 
{ 
    //show dialog 
} 

Tôi đã sử dụng vấn đề này để khắc phục sự cố trên các phiên bản Android cũ hơn trong vài năm nay và chưa thấy sự cố.

+0

Điều này thực sự là lừa! nhưng có cách nào để mở hộp thoại ngay cả khi điều đó xảy ra không? Tôi không thực sự chắc chắn về cách quản lý hộp thoại khi điều này xảy ra. Bất kỳ đề xuất? Cảm ơn trước! –

+0

@CarlaStabile hi! Cách duy nhất tôi có thể nghĩ để hiển thị hộp thoại khi điều này xảy ra là nếu bạn có thể có được một ngữ cảnh hợp lệ cho một hoạt động không hoàn thành - nó sẽ phụ thuộc vào nơi bạn đang gọi mã này và nếu bạn có cách để lấy ngữ cảnh từ hoạt động khác, không hoàn thiện. – DiscDev

+3

Cảm ơn một triệu! Đối với tôi, sự cố (với thông báo lỗi ở trên) sẽ xảy ra khi tôi nhấn nút quay lại, trước khi hộp thoại hiển thị. Vì vậy, mã sẽ tiếp tục và cố gắng thể hiện nó, mặc dù tôi đã hoạt động khác. Nhưng điều này đã ngăn chặn sự cố và tôi đã đi đến hoạt động mới một cách dễ dàng! – Azurespot

1

Tôi gặp lỗi này khi tôi có một countDownTimer trong ứng dụng của mình. Nó có một phương pháp gọi GameOver trong ứng dụng của tôi như

public void onFinish() { 
    GameOver(); 
} 

nhưng thực sự là trò chơi có thể kết thúc trước khi thời gian là lên do một nhấp chuột sai của người sử dụng (đó là một trò chơi click). Vì vậy, khi tôi đang xem hộp thoại Game Over, ví dụ: 20 giây, tôi quên hủy countDownTimer vì vậy khi thời gian đã hết, hộp thoại sẽ xuất hiện trở lại. Hoặc bị lỗi với lỗi trên vì lý do nào đó.

4

tôi phải đối mặt với cùng một vấn đề và sử dụng mã bởi DiscDev đề xuất ở trên với những thay đổi nhỏ như sau:

if (!MainActivity.this.isFinishing()){ 
    alertDialog.show(); 
} 
+2

Xin chào, bạn cần phải xây dựng (nhận xét mã hoặc bài đăng) về lý do bạn thay đổi điều này. Ngoài ra, hãy cung cấp liên kết đến đề xuất thay vì hồ sơ người dùng. –

+0

tôi đã thay đổi vì ngữ cảnh (Hoạt động) có nghĩa là MainActivity.này cho trường hợp của tôi. Ngoài ra bạn là đúng về liên kết hồ sơ người dùng, nhưng tôi nghĩ rằng bạn có thể tìm thấy nó ở trên. –

0

Việc sửa chữa này là khá đơn giản. Chỉ cần kiểm tra xem các Hoạt động đang trải qua giai đoạn hoàn thiện mình trước khi hiển thị Dialog:

private Handler myHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
    switch (msg.what) { 
     case DISPLAY_DLG: 
     if (!isFinishing()) { 
     showDialog(MY_DIALOG); 
     } 
     break; 
    } 
    } 
}; 

see more here

0

Trong trường hợp của tôi vấn đề đã được rằng Context được giữ như một tài liệu tham khảo yếu trong lớp mà kéo dài Handler . Sau đó, tôi đã đi qua Messenger, kết thúc tốt đẹp xử lý, thông qua một Intent đến một Service. Tôi đã làm điều này mỗi khi hoạt động xuất hiện trên màn hình theo phương thức onResume(). Vì vậy, như bạn đã hiểu, sứ giả đã được tuần tự hóa cùng với các lĩnh vực của nó (bao gồm cả ngữ cảnh), bởi vì nó là cách duy nhất để vượt qua các đối tượng sử dụng Intent - để sắp xếp chúng. Và tại thời điểm đó khi sứ giả được chuyển sang dịch vụ, bản thân hoạt động vẫn chưa sẵn sàng để hiển thị các hộp thoại vì nó ở trạng thái khác (được nói trênResume(), hoàn toàn khác với hoạt động đã có trên màn hình). Vì vậy, khi sứ giả được deserialized, bối cảnh vẫn còn ở trạng thái tiếp tục, trong khi các hoạt động thực sự đã có trên màn hình. Hơn nữa deserialization phân bổ bộ nhớ cho đối tượng mới, đó là hoàn toàn khác với bản gốc.

Vì vậy, giải pháp là chỉ để liên kết với dịch vụ mỗi lần bạn cần và trả lại binder có phương thức như 'setMessenger (Messenger messenger)' và gọi nó, khi bạn được liên kết với dịch vụ.

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