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


116

Tôi cố gắng kết nối với Facebook qua API Facebook, tôi làm theo ví dụ sau: 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 android.os.BinderProxy@405180f8 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?



1
Kiểm tra câu trả lời bên dưới. Tôi đã đánh dấu nó là đúng :)
Han Tran

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. Câu hỏi còn lại được hỏi trước và là một vấn đề giống hệt nhau với một câu trả lời về cơ bản giống hệt nhau.
bsara

1
Bạn có thấy câu hỏi của tôi là của 2 năm trước không?
Han Tran

1
Vì vậy, xem như những người khác Moderator có sai sót nhưng bạn :)) Anw, cảm ơn!
Han Tran

Câu trả lời:


127

Đ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. Một trường hợp phổ biến - nếu thao tác 'hiển thị hộp thoại' diễn ra sau một thao tác không đồng bộ và trong quá trình đó, hoạt động ban đầu (tức là chính của hộp thoại của bạn) bị hủy. Để có một mô tả tốt, hãy xem bài đăng trên blog này và nhận xét:

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 không đồng bộ hóa hoạt động auth và bạn có cơ chế Xử lý - Gọi lại (onComplete được gọi trên một trình nghe) có thể dễ dàng tạo ra tình huống 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ố đối với hoạt động / nó đã bị phá hủy trong quá trình làm việc của AsyncTask. Tôi không biết làm thế nào mà 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 Hoạt động làm 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 liệu đâ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 sau để biết một phương pháp làm như vậy:

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


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

Đối với tôi, tôi gọi điện thoại Fragment.getContext(), mà làm việc cho các API trên 21. Nhưng trên Lollipop nó bị treo
TheRealChx101

158

Tôi đã thấy lỗi này được báo cáo một lần trong 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 lại 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 được một mẹo nhỏ.


6
nó không giải quyết được vấn đề, nó cũng ngăn chặn sự cố và hiển thị hộp thoại
YTerle

6
Chỉ cần nhớ bạn nên kiểm tra context instanceof Activityhoặc bạn có thể nhận được một Exception!
FtheBuilder,

3
hoặc bạn có thể sử dụng getActivity () isFinishing () thay vì bối cảnh.
Nikita Axyonov

Tôi đang sử dụng API-23. Khi tôi cố gắng sử dụng điều này trong MainActivity mở rộng AppCompatActivity. Nó hiển thị cho tôi một lỗi như Gây ra bởi: java.lang.ClassCastException: com.creativeapp.hindihdvideosongs.AppController không thể truyền sang android.app.Activity tại com.creativeapp.hindihdvideosongs.MainActivity.onCreate (MainActivity.java:145) AppController là được thêm vào AndroidMenifest của tôi
pavel

Tôi không sử dụng bất kỳ đối thoại nào và gặp lỗi này.
Abdul Waheed

10

một giải pháp đơ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 ướt hơn có hoạt động hay không khi bạn muốn hiển thị hộp thoại.


quá xấu nhưng rất đẹp!
Rahul Tiwari

8
  • 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 onPostExecuteAsyncTask

  • Tuy nhiên, phương pháp sai của nó showing dialoghoặc Ui thay đổi trong onPostExecute.

  • Để làm được điều đó, chúng ta cần kiểm tra hoạt động đang ở trạng thái 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());
                            }
                        }
                    }
                });
    }
    

1

Tôi phải đối mặt với cùng một vấn đề. Cuộc 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' , nơi cảnh báo được hiển thị. Sau đó, không có sự cố nào xảy ra và thông báo 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

Sau khi thực thi chuỗi, hãy thêm hai dòng mã này và điều đó sẽ giải quyết được vấn đề.

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

1

Một trường hợp sử dụng khác của nhà phát triển: Nếu WindowManagerhoặc getWindow()đang được gọi trên onCreate()hoặc onStart()hoặc onResume(), a BadTokenExceptionđược ném. Bạn sẽ cần phải đợi cho đến khi chế độ xem được chuẩn bị và đính kèm.

Di chuyển mã để onAttachedToWindow()giải quyết nó. Nó có thể không phải là một giải pháp lâu dài, nhưng nếu tôi có thể thử nghiệm, nó luôn hoạt động.

Trong trường hợp của tôi, cần phải tăng độ sáng màn hình khi hiển thị hoạt động. Dòng getWindow().getAttributes().screenBrightnesstrong onResume()kết quả là một ngoại lệ. Di chuyển mã để onAttachedToWindow()hoạt động.


0

Đối với tôi, nó đã được khắc phục bằng cách chỉ xóa thuộc statictính 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 Windowtrong các phương thức đó


0

Trong phần dependencyServices không có gì ở trên giúp tôi được, 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

Không thể thêm cửa sổ - mã thông báo không hợp lệ; hoạt động của bạn có đang chạy không?

Sự cố này thường do ứng dụng của bạn cố gắng hiển thị hộp thoại bằng Hoạt động đã hoàn thành trước đó làm ngữ cảnh. Ví dụ: điều này có thể xảy ra nếu Hoạt động kích hoạt AsyncTask cố gắng hiển thị hộp thoại khi nó kết thúc, nhưng người dùng điều hướng trở lại từ Hoạt động trước khi nhiệm vụ hoàn thành.

Nguồn lực bên ngoài

Android - Hiển thị hộp thoại từ chuỗi nền

Lỗi: BinderProxy @ 45d459c0 không hợp lệ; hoạt động của bạn có đang chạy không?


0

Tôi đã giải quyết nó bằng cách đặt điều này:

@Override
protected void onDestroy() {
    accessTokenTracker.stopTracking();
    super.onDestroy();
}

Vui lòng chọn ngôn ngữ tiếng Anh khi đăng bài
Pedro Coelho
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.