L'activité a fui la fenêtre qui a été ajoutée à l'origine

Quelle est cette erreur, et pourquoi cela se produit-il?

05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window [email protected] that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window [email protected] that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.access00(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at dalvik.system.NativeStart.main(Native Method)
962
demandé sur MiguelHincapieC 2010-05-17 19:51:23
la source

30 ответов

vous essayez de montrer un dialogue après avoir quitté une activité.

[MODIFIER]

cette question Est l'une des recherches les plus importantes sur google pour Android developer, par conséquent, ajouter quelques points importants à partir des commentaires, ce qui pourrait être plus utile pour le futur chercheur sans aller en profondeur de la conversation de commentaires.

Réponse 1 :

Vous essayez de montrer un dialogue après avoir quitté une activité.

réponse 2

cette erreur peut être un peu trompeuse dans certaines circonstances (bien que la réponse est encore tout à fait précis) - c'est à dire dans mon cas un L'Exception non freinée a été jetée dans une AsyncTask, ce qui a causé la L'activité à l'arrêt, puis un progressdialog ouvert a causé ce Exception.. ainsi, la "vraie" exception était peu plus tôt dans le journal

réponse 3

Call dismiss() sur l'instance de dialogue que vous avez créée avant de quitter votre Activité, p.ex. en onPause () ou onDestroy ()

1302
répondu Alex Volovoy 2017-09-21 16:46:21
la source

la solution est d'appeler dismiss() sur le Dialog que vous avez créé dans viewP.java:183 avant de quitter le Activity , par exemple dans onPause() . Tous les Window s& Dialog s doivent être fermés avant de quitter un Activity .

373
répondu Márton Molnár 2015-04-15 18:11:51
la source

si vous utilisez AsyncTask , probablement ce message de log peut être trompeur. Si vous cherchez dans votre journal de bord, vous pourriez trouver une autre erreur, probablement une dans votre doInBackground() méthode de votre AsyncTask , qui rend votre Activity actuel pour exploser, et donc une fois que le AsyncTask revient.. eh bien, vous savez le reste. Quelques autres utilisateurs ont déjà expliqué que ici: -)

102
répondu ggomeze 2013-09-28 22:18:23
la source

vous pouvez obtenir cette exception par simple erreur, en appelant accidentellement finish() (par exemple) après avoir affiché un AlertDialog , si vous manquez une instruction break call dans une instruction switch...

   @Override
   public void onClick(View v) {
    switch (v.getId()) {
        case R.id.new_button:
            openMyAlertDialog();
            break; <-- If you forget this the finish() method below 
                       will be called while the dialog is showing!
        case R.id.exit_button:
            finish();
            break;
        }
    }

la méthode finish() va fermer la Activity , mais la AlertDialog est toujours affiché!

donc quand vous regardez attentivement le code, à la recherche de problèmes de threading ou de codage complexe et tel, ne perdez pas de vue la forêt pour les arbres. Parfois, cela peut être aussi simple et stupide qu'une déclaration de rupture manquante. :)

52
répondu Adrian Romanelli 2015-04-20 19:12:10
la source

j'ai déclenché cette erreur en appelant par erreur hide() au lieu de dismiss() sur un AlertDialog .

50
répondu Mark Phillip 2013-09-28 22:06:46
la source

ce problème se pose lorsque vous essayez d'afficher un dialogue après avoir quitté une activité.

je viens de résoudre ce problème juste en écrivant le code suivant:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( progressDialog!=null && progressDialog.isShowing() ){
        progressDialog.cancel();
    }
}

en gros, à partir de quelle classe vous avez commencé progressDialog, outrepassez la méthode onDestroy et faites de cette façon. Il a résolu le problème" L'activité a fui la fenêtre".

27
répondu Shoaib Ahmed 2012-09-27 14:11:59
la source

j'ai récemment fait face à la même question.

la raison derrière cette question Est que l'activité étant fermée avant le dialogue est rejetée. Il existe plusieurs raisons à la ci-dessus pour arriver. Ceux mentionnés dans les billets ci-dessus sont également corrects.

je suis entré dans une situation, parce que dans le fil, j'appelais une fonction qui lançait l'exception. En raison de quoi la fenêtre était écartée et donc l'exception.

19
répondu Tushar 2011-12-09 01:12:58
la source

les réponses à cette question étaient toutes correctes, mais un peu déroutantes pour moi de comprendre pourquoi. Après avoir joué pendant environ 2 heures, la raison de cette erreur (dans mon cas) m'a frappé:

vous savez déjà, en lisant d'autres réponses, que l'erreur X has leaked window [email protected][] signifie qu'une boîte de dialogue était ouverte lorsque votre application était fermée. Mais pourquoi?

il se pourrait que votre application se soit écrasée pour une autre raison alors que votre dialogue était ouvert

cela conduit à la fermeture de votre application en raison d'un bug dans votre code, qui conduit à ce que la boîte de dialogue reste ouverte en même temps que votre application fermée en raison de l'autre erreur.

regardez votre logique. Résolvez la première erreur, et la deuxième se résoudra d'elle-même. enter image description here

une erreur en provoque une autre, qui en provoque une autre, comme des DOMINOS!

13
répondu Ruchir Baronia 2017-06-27 03:31:28
la source

j'avais le même message d'erreur obscur et je ne savais pas pourquoi. Étant donné les indices des réponses précédentes, j'ai changé mes appels non-GUI en mDialog.finish() pour être mDialog.rejeter() et les erreurs ont disparu. Cela n'affectait pas le comportement de mon widget mais c'était déconcertant et aurait pu signaler une fuite importante de mémoire.

11
répondu Melinda Green 2011-03-27 09:49:55
la source

j'obtenais ces logs dans mon application de lecteur vidéo. Ces messages ont été lancés alors que le lecteur vidéo était fermé. Fait intéressant, j'ai utilisé pour obtenir ces journaux une fois dans quelques pistes de manière aléatoire. De plus, ma demande ne concerne pas progressdialog . Enfin, j'ai contourné ce problème avec la mise en œuvre ci-dessous.

@Override
protected void onPause()
{
    Log.v("MediaVideo", "onPause");
    super.onPause();
    this.mVideoView.pause();
    this.mVideoView.setVisibility(View.GONE);
}

@Override
protected void onDestroy()
{
    Log.v("MediaVideo", "onDestroy");
    super.onDestroy();
}

@Override
protected void onResume()
{
    Log.v("MediaVideo", "onResume");
    super.onResume();
    this.mVideoView.resume();
}

remplace le OnPause par mVideoView.pause() et l'ensemble visibility par GONE . De cette façon, je pouvais résoudre le problème d'erreur" Activity has leaked window " log.

11
répondu InvisiblePoint 2017-01-18 15:36:20
la source

renvoie le dialogue quand l'activité détruit

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}
10
répondu Muhammad Aamir Ali 2013-06-27 15:56:10
la source

j'avais le même problème et j'ai trouvé cette page, et même si ma situation était différente j'ai appelé finish d'un bloc if avant qu'il ne définisse la boîte d'alerte.

ainsi, simplement appeler dismiss ne fonctionnerait pas (comme il n'a pas encore été fait) mais après avoir lu réponse D'Alex Volovoy et réaliser que c'était la boîte d'alerte à l'origine. J'ai essayé d'ajouter une déclaration de retour juste après la finition à l'intérieur de ce bloc if et qui a résolu le problème.

j'ai pensé qu'une fois que vous avez appelé finish il a tout arrêté et fini juste là, mais il ne le fait pas. Il semble aller à la fin du bloc de code il est dans puis finis.

donc, si vous voulez mettre en place une situation où parfois il finira avant de faire un code, vous devez mettre une déclaration de retour juste après l'arrivée ou il va continuer et et agir comme l'arrivée a été appelé à la fin du bloc de code pas où tu l'as appelé. C'est pourquoi j'ai eu toutes ces erreurs bizarres.

private picked(File aDirectory){
     if(aDirectory.length()==0){
        setResult(RESULT_CANCELED, new Intent()); 
        finish(); 
        return;
    }
     AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder
     alert
        .setTitle("Question")
        .setMessage("Do you want to open that file?"+aDirectory.getName());
    alert
        .setPositiveButton("OK", okButtonListener)
        .setNegativeButton("Cancel", cancelButtonListener);
    alert.show();
}

si vous ne mettez pas le retour juste après que j'ai appelé terminer là-dedans, il agira comme si vous l'aviez appelé après le alert.show(); et donc il dirait que la fenêtre est fuitée en terminant juste après que vous ayez fait apparaître le dialogue, même si ce n'est pas le cas, il pense toujours qu'il est.

j'ai pensé que j'ajouterais ceci car ici ceci montre que la commande finish a agi autrement, je pensais que c'était le cas et je suppose qu'il y a d'autres personnes qui pensent la même chose que moi avant que je découvre ceci.

10
répondu Kit Ramos 2018-03-15 22:09:11
la source

cela pourrait aider.

if (! isFinishing()) {

    dialog.show();

    }
9
répondu sandy 2013-04-26 13:47:30
la source

Ce n'est pas la réponse à la question mais c'est pour le sujet.

Si l'activité a défini un attribut dans le Manifeste

 android:noHistory="true"

puis après avoir exécuté onPause (), le contexte d'activité est perdu. Donc toute la vue utilisant ce contexte pourrait donner cette erreur.

7
répondu Killer 2016-05-09 17:25:52
la source

non seulement essayer de montrer une alerte, mais il peut également être invoqué lorsque vous terminez une instance particulière de l'activité et essayer de commencer une nouvelle activité/service ou essayer de l'arrêter.

exemple:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
6
répondu Kulbhushan Chaskar 2018-03-16 04:36:01
la source

essayez ce code:

public class Sample extends Activity(){
@Override
 public void onCreate(Bundle instance){

}
 @Override
    public void onStop() {
        super.onStop();
      progressdialog.dismiss(); // try this
    }

}
5
répondu tinku 2013-04-10 15:17:11
la source

cela peut être si vous avez une erreur à la fonction doInBackground() et si vous avez ce code.

essayez enfin d'ajouter dialog. Au premier contrôle et de fixer doInBackground() fonction

protected void onPreExecute() {
     super.onPreExecute();
     pDialog = new ProgressDialog(CreateAccount.this);
     pDialog.setMessage("Creating Product..");
     pDialog.setIndeterminate(false);
     pDialog.setCancelable(true);
     pDialog.show();

 }

 protected String doInBackground(String...args) {
     ERROR CAN BE IS HERE
 }

 protected void onPostExecute(String file_url) {
     // dismiss the dialog once done
     pDialog.dismiss();
5
répondu NickUnuchek 2013-07-20 11:49:42
la source

cela m'est arrivé quand j'utilise ProgressDialog dans AsyncTask . En fait, j'utilise la méthode hide() dans onPostExecute . Basé sur la réponse de @Alex Volovoy je dois utiliser dismiss() avec ProgressDialog pour l'enlever dans onPostExecute et son fait.

progressDialog.hide(); // Don't use it, it gives error

progressDialog.dismiss(); // Use it
5
répondu SANAT 2016-02-19 08:29:50
la source

l'erreur " Activity has leaked window that was originally added... "se produit lorsque vous essayez de montrer une alerte après le Activity est effectivement finished .

vous avez deux options AFAIK:

  1. Repenser la connexion de votre alerte: appel dismiss() sur le dialog avant de sortir de votre activité.
  2. mettez le dialog dans un fil différent et lancez-le sur ce thread (indépendant du courant activity ).
5
répondu Kyle Clegg 2017-01-18 16:13:30
la source

a eu le problème où j'ai terminé une activité quand un ProgressDialog était encore montré.

donc d'abord cacher le dialogue et ensuite finir l'activité.

4
répondu LeonS 2013-03-06 10:36:11
la source

, Vous devez faire Progressdialog objet onPreExecute méthode de AsyncTask et vous devriez dismiss sur onPostExecute la méthode.

4
répondu ammad 2017-01-18 15:36:50
la source

généralement, ce problème se produit en raison de dialogue de progrès : vous pouvez résoudre cela en utilisant l'une des méthodes suivantes dans votre activité:

 // 1):
          @Override
                protected void onPause() {
                    super.onPause();
                    if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
                  {
                        yourProgressDialog.cancel();
                    }
                }

       // 2) :
         @Override
            protected void onDestroy() {
                super.onDestroy();
                if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
               {
                    yourProgressDialog.cancel();
                }
            }
4
répondu Bapusaheb Shinde 2018-03-16 07:31:34
la source

dans mon cas, la raison était que j'ai oublié d'inclure une permission dans le fichier de manifeste Android.

comment l'ai-je su? Tout comme @Bobby dit dans un commentaire sous la réponse acceptée, faites défiler plus loin jusqu'à vos logs et vous verrez la première raison ou événement qui a vraiment jeté l'Exception. Apparemment, le message "Activity has leaked window that was originally added" n'est qu'une Exception qui résulte de la première Exception.

3
répondu Matt Quiros 2012-09-08 21:05:06
la source

la meilleure solution est juste ajouter le dialogue dans essayer attraper et rejeter le dialogue quand l'exception se produisent

il suffit d'utiliser le code ci-dessous

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }
3
répondu Ness Tyagi 2017-11-01 12:56:29
la source

essayez ci-dessous code , il fonctionnera à chaque fois que vous rejetterez le dialogue de progrès et il verra si son instance est disponible ou non.

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
2
répondu Developer 2014-02-14 10:16:16
la source

les exceptions relatives aux fuites de fenêtres ont deux raisons:

1) affichage du dialogue lorsque le contexte D'activité n'existe pas, pour résoudre ce problème, vous devez afficher le dialogue seulement si vous êtes sûr que L'activité existe:

if(getActivity()!= null && !getActivity().isFinishing()){
        Dialog.show();
}

2) Ne pas rejeter le dialogue de manière appropriée, pour résoudre utiliser ce code:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( Dialog!=null && Dialog.isShowing() ){
        Dialog.dismiss();
}
}
2
répondu Sherry 2015-09-17 23:09:50
la source

la meilleure solution est mis avant d'afficher progressbar ou progressDialog

if (getApplicationContext().getWindow().getDecorView().isShown()) {

  //Show Your Progress Dialog

}
2
répondu Ali Akram 2018-06-29 09:45:41
la source

assurez-vous simplement que votre activité ne se termine pas de façon inattendue en raison de certaines exceptions soulevées quelque part dans votre code. Généralement cela se produit dans la tâche async quand l'activité fait face à la fermeture de force dans la méthode doinBackground et ensuite asynctask retourne à la méthode onPostexecute.

1
répondu Manas Ranjan 2013-12-16 13:26:37
la source
  if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
1
répondu androidmalin 2016-06-27 17:17:13
la source

le problème selon moi est que vous essayez d'appeler un dialogue juste après une activité se termine donc selon moi ce que vous pouvez faire est de donner un certain retard en utilisant Handler et Vous problème sera résolu par exemple:

 Handler handler=new Handler();
     handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                     dialog.show();
                     //or
                     dialog.dismiss();

                }
            },100);
1
répondu Satish Silveri 2016-12-08 10:24:25
la source

Autres questions sur android memory-leaks dialog