2012-03-02 35 views
69

Tôi cố gắng kết nối với Facebook qua Facebook API, tôi làm theo ví dụ sau: https://github.com/facebook/facebook-android-sdk/tree/master/examples/simpleKhô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 có đang chạy không?

Mọi thứ đều ổn, nhưng khi tôi cố gắng chỉnh sửa mã, tôi muốn hiển thị thông báo sau khi đăng nhập thành công như thế này:

public void onAuthSucceed() { 
     mText.setText("You have logged in! "); 
     //This is the code to call the post message dialog.      
     mFacebook.dialog(Example.this, "feed",new SampleDialogListener()); 
    } 

tôi nhận được lỗi này trong logcat:

03-02 13:32:08.629: E/AndroidRuntime(14991): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.ViewRoot.setView(ViewRoot.java:532) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.app.Dialog.show(Dialog.java:241) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Facebook.dialog(Facebook.java:780) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Facebook.dialog(Facebook.java:737) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Example$SampleAuthListener.onAuthSucceed(Example.java:113) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.SessionEvents.onLoginSuccess(SessionEvents.java:78) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Example$LoginDialogListener.onComplete(Example.java:88) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.Facebook$1.onComplete(Facebook.java:320) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.facebook.android.FbDialog$FbWebViewClient.shouldOverrideUrlLoading(FbDialog.java:144) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:218) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:337) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.os.Looper.loop(Looper.java:130) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at android.app.ActivityThread.main(ActivityThread.java:3687) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at java.lang.reflect.Method.invokeNative(Native Method) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at java.lang.reflect.Method.invoke(Method.java:507) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
03-02 13:32:08.629: E/AndroidRuntime(14991): at dalvik.system.NativeStart.main(Native Method) 

Bất kỳ ý tưởng?

+0

có thể trùng lặp với [Lỗi: BinderProxy @ 45d459c0 không hợp lệ; hoạt động của bạn đang chạy?] (http://stackoverflow.com/questions/7811993/error-binderproxy45d459c0-is-not-valid-is-your-activity-running) – bsara

+1

Kiểm tra câu trả lời bên dưới. Tôi đã đánh dấu nó là chính xác :) –

+0

Chỉ vì bạn đã đánh dấu câu trả lời không thay đổi thực tế rằng đây là một câu hỏi trùng lặp. Người kia được hỏi trước và là một vấn đề giống hệt với câu trả lời cơ bản giống hệt nhau. – bsara

Trả lời

90

Điều này có thể xảy ra khi bạn đang hiển thị hộp thoại cho ngữ cảnh không còn tồn tại nữa. Một trường hợp phổ biến - nếu thao tác 'hiển thị hộp thoại' là sau một thao tác không đồng bộ và trong quá trình đó hoạt động ban đầu (đó là làm cha mẹ của hộp thoại của bạn) bị hủy. Đối với một mô tả tốt, xem bài đăng blog và nhận xét:

http://dimitar.me/android-displaying-dialogs-from-background-threads/

Từ stack trace ở trên, có vẻ như các thư viện facebook quay ra khỏi hoạt động auth không đồng bộ, và bạn có một Handler - cơ chế gọi lại (onComplete kêu gọi một người nghe) có thể dễ dàng tạo ra kịch bản này.

Khi tôi thấy điều này được báo cáo trong ứng dụng của mình, nó khá hiếm và phù hợp với trải nghiệm trong bài đăng trên blog. Đã xảy ra sự cố với hoạt động/nó đã bị phá hủy trong quá trình hoạt động của AsyncTask. Tôi không biết làm thế nào sửa đổi của bạn có thể dẫn đến điều này mỗi lần, nhưng có lẽ bạn đang tham chiếu một hoạt động như bối cảnh cho hộp thoại mà luôn luôn bị phá hủy bởi thời gian mã của bạn thực hiện?

Ngoài ra, trong khi tôi không chắc chắn nếu điều này là cách tốt nhất để biết hoạt động của bạn đang chạy, xem câu trả lời này cho một phương pháp làm như vậy:

Check whether activity is active

+0

Không giải quyết được sự cố của tôi, nhưng được hướng dẫn tốt! –

+2

Không gọi 'dialog.show()' giải quyết vấn đề nhưng công việc xung quanh nó là gì để có thể hiển thị hộp thoại của tôi? – natsumiyu

99

Tôi đã nhìn thấy lỗi này 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, và đây là những gì giải quyết nó cho tôi:

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

Tất cả các câu trả lời khác ngoài kia dường như đang làm những điều kỳ lạ như lặp qua danh sách các hoạt động chạy, nhưng đây là đơn giản hơn nhiều và dường như làm rick.

+3

nó không giải quyết vấn đề, nó ngăn ngừa tai nạn và hiển thị hộp thoại cũng – YTerle

+2

Chỉ cần nhớ bạn nên kiểm tra 'context instanceof Activity' hoặc bạn có thể nhận được một' ngoại lệ '! – FtheBuilder

+2

hoặc bạn có thể sử dụng getActivity(). IsFinishing() thay vì ngữ cảnh –

3

This website liệt kê 3 phương pháp kiểm tra riêng biệt nếu một số Activity nhất định là chạy và cung cấp đoạn mã để trợ giúp bạn. Tuy nhiên, hãy nhớ rằng việc kiểm tra xem hoạt động vẫn đang chạy là chỉ được khuyên gỡ lỗi mục đích vì kết quả của nó là bất cứ điều gì nhưng chắc chắn và do đó không phù hợp với luồng mã/logic.

+0

của tôi, bạn có thể giải thích những gì đằng sau liên kết không? – Antek

2

Tôi phải đối mặt chính xác cùng một vấn đề. Gọi số '(!isFinishing())' đã ngăn chặn sự cố, nhưng không thể hiển thị thông báo 'cảnh báo'.

Sau đó, tôi đã thử thực hiện chức năng gọi 'tĩnh', nơi thông báo được hiển thị. Sau đó, không có sự cố xảy ra và tin nhắn cũng được hiển thị.

Đối với ví dụ:

public static void connect_failure() {  
     Log.i(FW_UPD_APP, "Connect failed"); 

     new AlertDialog.Builder(MyActivity) 
     .setTitle("Title") 
     .setMessage("Message") 
     .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
        //do nothing 
      } 
     }) 
     .setIcon(R.drawable.the_image).show();  
    } 
-1

Bạn có thể sử dụng một tĩnh biến trong hoạt động này. Nếu isActivityLive là true thì gọi phương thức của bạn.

class MyActivity extends Activity { 
    static boolean isActivityLive = false; 

     @Override 
     public void onStart() { 
     super.onStart(); 
     isActivityLive = true; 
     } 

     @Override 
     public void onStop() { 
     super.onStop(); 
     isActivityLive = false; 
     } 
} 
Các vấn đề liên quan