142 votes

Impossible d'ajouter une fenêtre -- le jeton Android.os.BinderProxy n'est pas valide ; votre activité est-elle en cours d'exécution ?

J'essaie de me connecter à Facebook via l'API Facebook, en suivant cet exemple : https://github.com/facebook/facebook-Android-sdk/tree/master/examples/simple

Tout va bien, mais lorsque j'essaie d'éditer du code, je veux afficher le message du dialogue après la réussite de la connexion comme ceci :

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

Je reçois cette erreur dans le 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)

Une idée ?

1voto

Bholendra Singh Points 321

Impossible d'ajouter une fenêtre -- le jeton n'est pas valide ; votre activité est-elle en cours d'exécution ?

Ce plantage est généralement dû au fait que votre application tente d'afficher une boîte de dialogue en utilisant comme contexte une activité précédemment terminée. Par exemple, cela peut se produire si une Activity déclenche une AsyncTask qui tente d'afficher une boîte de dialogue lorsqu'elle est terminée, mais que l'utilisateur revient de l'Activity avant que la tâche ne soit achevée.

Ressources externes

Android - Affichage de dialogues à partir de fils de discussion en arrière-plan

Erreur : BinderProxy@45d459c0 n'est pas valide ; votre activité est-elle en cours ?

1voto

Mohd Qasim Points 20

La façon dont j'ai procédé est à chaque fois de rejeter et de faire null la référence du dialogue avant l'affichage du dialogue

public static void showProgressDialog(Context context){
    if (context==null)return;
    //do force null when trigger this method to avoid Unable to add window -- token android.os.BinderProxy is not valid; is your activity running?
    if (dialog!=null && dialog.isShowing()){
        dialog.dismiss();
        dialog=null;
    }
    dialog=new Dialog(context);

    dialog.setCancelable(false);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.setContentView(ProgressBarLayoutBinding.inflate(LayoutInflater.from(context)).getRoot());
    if ((context instanceof AppCompatActivity  &&  !((AppCompatActivity) context).isFinishing()) && !dialog.isShowing()) {
        dialog.show();
    }
}

1voto

ACLima Points 21

Ce site web énumère 3 méthodes distinctes pour vérifier si une certaine Activity es en cours d'exécution et fournit des extraits de code pour vous aider. Cependant, n'oubliez pas que vérifier si une activité est toujours en cours d'exécution est conseillé uniquement pour le débogage car son résultat est loin d'être certain et n'est donc pas adapté au flux de code/logique.

1voto

ArunJTS Points 145

J'ai rencontré exactement le même problème. Appel '(!isFinishing())' a empêché le crash, mais n'a pas pu afficher le message d'alerte.

J'ai ensuite essayé d'appeler la fonction statique où l'alerte est affichée. Après cela, aucun crash ne s'est produit et le message s'affiche également.

Par exemple :

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

0voto

Ram Iyer Points 1

Un autre cas d'utilisation pour les développeurs : Si le WindowManager o getWindow() est appelé sur onCreate() o onStart() o onResume() , a BadTokenException est lancé. Vous devrez attendre que la vue soit préparée et attachée.

Déplacer le code vers onAttachedToWindow() le résout. Ce n'est peut-être pas une solution permanente, mais dans la mesure où j'ai pu faire des essais, cela a toujours fonctionné.

Dans mon cas, il a fallu augmenter la luminosité de l'écran lorsque l'activité est devenue visible. La ligne getWindow().getAttributes().screenBrightness en el onResume() a donné lieu à une exception. En déplaçant le code vers onAttachedToWindow() a travaillé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X