Невозможно добавить окно - токен android.os.BinderProxy недействителен;ваша деятельность работает? - PullRequest
91 голосов
/ 02 марта 2012

Я пытаюсь подключиться к Facebook через Facebook API, следую этому примеру: 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)

Есть идеи?

Ответы [ 7 ]

129 голосов
/ 24 января 2013

Я видел эту ошибку, сообщаемую время от времени из некоторых моих приложений, и вот что решило ее для меня:

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

Все остальные ответы, кажется, делают странные вещи, такие как итерациячерез список текущих действий, но это намного проще и, кажется, делает свое дело.

109 голосов
/ 09 мая 2012

Это может произойти, когда вы показываете диалог для контекста, который больше не существует.Распространенный случай - если операция 'show dialog' выполняется после асинхронной операции, и во время этой операции исходная операция (которая должна быть родительской для вашего диалога) уничтожается.Хорошее описание см. В этом посте и комментариях:

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

Из приведенной выше трассировки стека видно, что библиотека facebook асинхронно отключает операцию аутентификации, и у вас естьОбработчик - механизм обратного вызова (onComplete, вызываемый слушателем), который может легко создать этот сценарий.

Когда я видел это в моем приложении, оно довольно редкое и соответствует опыту в блоге.Что-то пошло не так в работе / было уничтожено во время работы AsyncTask.Я не знаю, как ваша модификация могла приводить к этому каждый раз, но, возможно, вы ссылаетесь на Activity как на контекст для диалога, который всегда уничтожается при выполнении вашего кода?

Кроме того, пока я 'Я не уверен, что это лучший способ узнать, выполняется ли ваша деятельность, см. этот ответ для одного из способов сделать это:

Проверьте, активна ли активность

4 голосов
/ 15 июля 2018

Один простой обходной путь - поймать исключение:

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

Это не элегантно, но иногда легко, когда вам приходится управлять асинхронными операциями, и вы не уверены, что активна активность или нет, когда вы хотите показатьдиалог.

1 голос
/ 08 января 2019
  • В моем случае проблема возникла из-за того, что я пытаюсь открыть / показать диалоговое окно в onPostExecute AsyncTask

  • Однако это неправильный метод showing dialog или изменения пользовательского интерфейса в 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 голос
/ 04 сентября 2018

После выполнения потока добавьте эти две строки кода, и это решит проблему.

Looper.loop();
Looper.myLooper().quit();
1 голос
/ 10 июня 2014

Я столкнулся с точно такой же проблемой. Вызов '(!isFinishing())' предотвратил сбой, но не смог отобразить сообщение «alert».

Затем я попытался вызвать функцию 'static' , где отображается предупреждение. После этого сбоя не произошло, и сообщение также отображается.

Например:

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();      
    }
0 голосов
/ 04 июля 2019

Для меня это было исправлено простым удалением свойства static в методах DialogHelper.class (resposble для создания и скрытия диалога), так как у меня есть свойства, связанные с Window в этих методах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...