Неможливо додати вікно - маркер android.os.BinderProxy недійсний; чи працює ваша діяльність?


116

Я намагаюся підключитися до Facebook через API Facebook, я дотримуюся цього прикладу: https://github.com/facebook/facebook-android-sdk/tree/master/examples/simple

Все нормально, але коли я намагаюся редагувати якийсь код, я маю на увазі, що хочу відобразити діалогове повідомлення після успішного входу, як це:

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());   
    }

Я отримую цю помилку в 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)

Будь-яка ідея?



1
Перевірте відповідь нижче. Я відзначив, що це правильно :)
Хан Тран

Тільки тому, що ви позначили відповідь, не змінюється той факт, що це повторне запитання. Першого було задано першим і це ідентичне питання з принципово однаковою відповіддю.
бсара

1
Ви бачили, що моє запитання 2 роки тому?
Хан Тран

1
Тож виглядайте, як інші Модератор помилився, але ви :)) О, дякую!
Хан Тран

Відповіді:


127

Це може статися, коли ви показуєте діалогове вікно для контексту, якого більше не існує. Поширений випадок - якщо операція "показ діалогового вікна" після асинхронної операції, і під час цієї операції початкова активність (тобто батько діалогового вікна) буде знищена. Для хорошого опису дивіться цю публікацію в блозі та коментарі:

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

З сліду стека вище, видно, що бібліотека facebook відключає роботу аутентифікації асинхронно, і у вас є механізм Handler - Callback (onComplete, викликаний слухачем), який міг легко створити цей сценарій.

Коли я бачив, як про це повідомляється у моєму додатку, він досить рідкісний і відповідає досвіду в публікації в блозі. Щось пішло не так для діяльності / вона була знищена під час роботи AsyncTask. Я не знаю, як ваша модифікація може призвести до цього кожного разу, але, можливо, ви посилаєтесь на Діяльність як на контекст діалогу, який завжди руйнується часом виконання коду?

Крім того, хоча я не впевнений, що це найкращий спосіб сказати, чи працює ваша діяльність, див. Цю відповідь для одного методу:

Перевірте, чи активна активність


3
Не дзвінок dialog.show()вирішує проблему, але яка робота над нею, щоб все-таки показати мій діалог?
натсумію

Для мене я дзвоню Fragment.getContext(), який працює для API вище 21. Але на Lollipop він виходить з ладу
TheRealChx101

158

Я бачив цю помилку, яку інколи повідомлялося в деяких моїх програмах, і ось що для мене вирішило:

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

Усі інші відповіді там, здається, роблять дивні речі, такі як повторення через список запущених видів діяльності, але це набагато простіше і, здається, робить свою справу.


6
це не вирішує проблему, а також запобігає краху та показу діалогу
YTerle

6
Просто пам’ятайте, що ви повинні перевірити, context instanceof Activityабо ви можете отримати Exception!
FtheBuilder

3
або ви можете використовувати getActivity (). isFinishing () замість контексту
Микита Аксьонов

Я використовую API-23. Коли я намагаюся використовувати це у своїй MainActivity, яка розширює AppCompatActivity. Він показує мені помилку на зразок Викликано: java.lang.ClassCastException: com.creativeapp.hindihdvideosongs.AppController не можна передавати на android.app.Activity at com.creativeapp.hindihdvideosongs.MainActivity.onCreate (MainActivity.java:145) є AppCont додано в мій AndroidMenifest
pavel

Я не використовую жодного діалогу і отримую цю помилку.
Абдул Вахід

11

один простий спосіб вирішити виняток:

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

Це не елегантно, але іноді легко, коли вам доведеться керувати операціями з асинхронізацією, і ви не впевнені, що активність працює чи ні, коли ви хочете показати діалогове вікно.


1
така потворна, але така гарна!
Рахул Тіварі

8
  • У моєму випадку проблема виникає через те, що я намагаюся відкрити / показати діалогове вікно в onPostExecuteAsyncTask

  • Однак його неправильний метод showing dialogабо Ui змінюється в onPostExecute.

  • Для цього нам потрібно перевірити, чи активність є в активному Напр .: !isFinishing() , якщо активність не закінчена, тоді можна лише показати наше діалогове вікно чи змінити інтерфейс користувача.

    @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

Я зіткнувся з точно таким же питанням. Виклик '(!isFinishing())'запобіг аварії, але він не міг відобразити повідомлення "попередження".

Потім я спробував зробити функцію виклику "статична" , де відображається попередження. Після цього жодної аварії не сталося, а також з'являється повідомлення.

Наприклад:

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

Інший випадок використання розробника: якщо WindowManagerабо getWindow()викликається onCreate()або, onStart()або onResume()a BadTokenException. Вам потрібно буде почекати, поки подання не буде підготовлене та додане.

Переміщення коду для onAttachedToWindow()його вирішення. Це може бути не постійним рішенням, але наскільки я міг перевірити, він завжди працював.

У моєму випадку виникла потреба в збільшенні яскравості екрану, коли активність стала видимою. Рядок getWindow().getAttributes().screenBrightnessу результаті onResume()призвів до винятку. Переміщення коду до onAttachedToWindow()відпрацьованого.


0

Для мене це було виправлено просто видаленням staticвластивості в методах DialogHelper.class (переміщення для створення та приховування діалогового вікна), оскільки у мене є властивості, пов'язані з Windowцими методами


0

У залежності від сервісу нічого з вищезазначеного мені не допомогло, я в кінцевому підсумку робив так, як нижче:

    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);
        }
    }

Я повинен використовувати "подвійний клас", оскільки інтерфейс не може бути статичним. L-


0

Неможливо додати вікно - маркер недійсний; чи працює ваша діяльність?

Цей збій зазвичай спричиняється вашим додатком, який намагається відобразити діалогове вікно, використовуючи попередньо закінчену діяльність як контекст. Наприклад, це може статися, якщо активність запускає AsyncTask, який намагається відобразити діалогове вікно після його завершення, але користувач повертається назад із діяльності, перш ніж завдання буде виконано.

Зовнішні ресурси

Android - відображення діалогів із фонових ниток

Помилка: BinderProxy @ 45d459c0 недійсний; чи працює ваша діяльність?


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.