it-swarm-vi.com

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 có chạy không?

Tôi cố gắng kết nối với Facebook thông qua API Facebook, tôi làm theo ví dụ này: https://github.com/facebook/facebook-Android-sdk/tree/master/examples/simple

Mọi thứ đều ổn, nhưng khi tôi cố gắng chỉnh sửa một số mã, ý tôi là tôi muốn hiển thị thông báo bài đăng hộp thoại 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? 

84
Han Tran

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

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

Từ dấu vết ngăn xếp ở trên, có vẻ như thư viện facebook đã tắt hoạt động auth không đồng bộ và bạn có cơ chế Handler - Callback (onComplete được gọi trên trình nghe) có thể dễ dàng tạo ra kịch bản này.

Khi tôi thấy báo cáo này 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 lỗi cho 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 luôn bị phá hủy theo thời gian mã của bạn thực thi?

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

Kiểm tra xem hoạt động có hoạt động không

101
Peter Pascale

Tôi đã thấy lỗi này được báo cáo thỉnh thoảng từ một số ứng dụng của mình và đây là điều đã 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 đi lặp lại qua danh sách các hoạt động đang chạy, nhưng điều này đơn giản hơn nhiều và dường như thực hiện thủ thuật.

122
DiscDev

một cách giải quyết đơn giản là bắt ngoại lệ: 

try {
        alertDialog.show()
    }
catch (WindowManager.BadTokenException e) {
        //use a log message
    }

Nó không thanh lịch nhưng đôi khi dễ dàng khi bạn phải quản lý các hoạt động không đồng bộ và bạn không chắc hoạt động của wether có hoạt động hay không khi bạn muốn hiển thị hộp thoại.

4
gerz

Trang web này liệt kê 3 phương pháp kiểm tra riêng biệt nếu một Activity nhất định là đang chạy và cung cấp các đoạn mã để giúp bạn. Tuy nhiên, hãy nhớ rằng việc kiểm tra xem một hoạt động có còn chạy hay không chỉ được khuyên dùng cho mục đích gỡ lỗi 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.

3
ACLima

Sau khi thực hiện luồng, thêm hai dòng mã này và điều đó sẽ giải quyết vấn đề.

Looper.loop();
Looper.myLooper().quit();
1

Tôi phải đối mặt với chính xác cùng một vấn đề. Gọi '(!isFinishing())' đã ngăn chặn sự cố, nhưng nó 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' , trong đó cảnh báo được hiển thị. Sau đó, không có sự cố nào xảy ra và tin nhắn cũng được hiển thị.

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
ArunJTS

Đối với tôi, nó đã được sửa bằng cách chỉ xóa thuộc tính static trong các phương thức DialogHelper. Class (có thể thay thế để tạo và ẩn hộp thoại), vì tôi có các thuộc tính liên quan đến Window trong các phương thức đó

0
Dasser Basyouni
  • Trong trường hợp của tôi, sự cố xảy ra do tôi đang cố mở/hiển thị hộp thoại trong onPostExecute AsyncTask

  • Tuy nhiên, đó là một phương thức sai của showing dialog hoặc Ui thay đổi trong onPostExecute.

  • Vì vậy, chúng tôi cần kiểm tra hoạt động đang hoạt động Ví dụ: !isFinishing(), nếu hoạt động chưa kết thúc thì chỉ có thể hiển thị hộp thoại của chúng tôi hoặc thay đổi ui. 

    @Override
    protected void onPostExecute(String response_str) {
    
       getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (!((Activity) mContext).isFinishing()) {
                            try {
                                ShowAgilDialog();
                            } catch (WindowManager.BadTokenException e) {
                                Log.e("WindowManagerBad ", e.toString());
                            }
                        }
                    }
                });
    }
    
0
Agilanbu

Trong sự phụ thuộc Dịch vụ không có gì ở trên giúp tôi, cuối cùng tôi đã làm như dưới đây:

    class Static_Toast_Android
    {
        private static Context _context
        {
            get { return Android.App.Application.Context; }
        }
        public static void StaticDisplayToast(string message)
        {
            Toast.MakeText(_context, message, ToastLength.Long).Show();
        }
    }
    public class Toast_Android : IToast
    {

        public void DisplayToast(string message)
        {
            Static_Toast_Android.StaticDisplayToast(message);
        }
    }

Tôi phải sử dụng "lớp kép" vì giao diện không thể tĩnh. L-

0
Legion