L'activité a divulgué une fenêtre qui a été ajoutée à l'origine


1163

Quelle est cette erreur et pourquoi se produit-elle?

05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 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.access$2200(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)

6
L'autre classique est lorsque l'orientation change: stackoverflow.com/questions/1111980/…
rds

Réponses:


1562

Vous essayez d'afficher une boîte de dialogue après avoir quitté une activité.

[ÉDITER]

Cette question est l'une des principales recherches sur Google pour les développeurs Android, ajoutant donc quelques points importants des commentaires, ce qui pourrait être plus utile pour le futur enquêteur sans entrer dans la profondeur de la conversation.

Réponse 1 :

Vous essayez d'afficher une boîte de 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 soit toujours complètement exacte) - c'est-à-dire que dans mon cas, une exception non gérée a été lancée dans une tâche AsyncTask, ce qui a provoqué l'arrêt de l'activité, puis un dialogue de progression ouvert a provoqué cette exception. la «vraie» exception était un peu plus tôt dans le journal

Réponse 3

Appelez shutdown () sur l'instance de dialogue que vous avez créée avant de quitter votre activité, par exemple dans onPause () ou onDestroy ()


2
@Override public void onStop () {if (dialog! = Null) {dialog.dismiss (); dialog = null; }}
Md.Tarikul Islam

14
Même après 8 ans, c'est toujours d'actualité! J'ai eu l'exception parce que l'activité a été fermée alors qu'elle essayait d'afficher mon AlertDialog (donc la réponse 2). En fin de compte, j'ai découvert que l'application ajoutait un objet "nul" à la scène (cela n'aurait pas dû se produire, mais c'est le cas), mais cela n'a pas donné d'exception supplémentaire et le tout a été masqué par le "fuite" fenêtre "exception à la place.
Néph

Est-il possible de rechercher toutes les boîtes de dialogue ouvertes et de toutes les fermer dans onStop ()? Je génère des dialogues dans un ListView en cliquant sur des éléments. Je ne sais pas comment récupérer leur référence depuis onStop.
Myoch

1
La réponse 3 est la meilleure solution. a beaucoup travaillé pour moi. Merci kaze, Alex !!
amit bansode

astuce supplémentaire si vous affichez la boîte de dialogue dans une boucle assurez-vous que la boucle est fermée après la fin de l'activité
Thecarisma

406

La solution est d'appeler dismiss()le que Dialogvous avez créé dans viewP.java:183avant de quitter le Activity, par exemple dans onPause(). Tous Windowles Dialogarticles doivent être fermés avant de quitter un Activity.


3
Ainsi, lorsque l'utilisateur fait pivoter le téléphone, toutes les boîtes de dialogue doivent être fermées ?? Cela ne semble pas juste.
LarsH

@LarsH comme vous pouvez le voir, ma réponse a été écrite il y a plus de 7 ans, et c'était certainement vrai à l'époque. Je ne travaille plus avec Android, mais d'après ce que je vois dans la documentation , cela pourrait toujours être le cas, mais Android a parcouru un long chemin depuis (introduit Fragments pour n'en nommer qu'un), donc c'est probablement plus facile maintenant.
molnarm

108

Si vous utilisez AsyncTask, probablement ce message de journal peut être trompeur. Si vous recherchez dans votre journal, vous pourriez trouver une autre erreur, probablement une dans votre doInBackground()méthode AsyncTask, qui fait Activityexploser votre courant , et donc une fois que le AsyncTaskretour est fait ... eh bien, vous connaissez le reste. D'autres utilisateurs l'ont déjà expliqué ici :-)


22
Parfois, dans ce cas, je ne peux pas voir la véritable exception. Pour trouver la véritable exception, commentez simplement progressDialog.show () et exécutez à nouveau l'application .. maintenant vous la voyez.
Coincé

Salut les gens! Comme mentionné ci-dessus par @Stuck, je ne vois pas non plus la vraie exception, qu'est-ce que j'ai fait? Je dépisté en utilisant des points de rupture et j'ai découvert que j'utilisais une référence d'une classe d'application dans la méthode doInBackgroundde la AsyncTaskclasse , mais sans la déclarer dans le AndroidManifestfichier en utilisant la propriété android:namecomme ceci: android:name="my.package.MyApplicationClass". Une bonne pratique lors de son utilisation AsyncTaskest de toujours penser à instancier votre alerte dans la méthode onPreExecuteet à la désactiver onPostExecute.
GFPF

66

J'ai déclenché cette erreur en appelant par erreur hide()plutôt que dismiss()sur un AlertDialog.


4
Exactement ce qui m'est arrivé. En outre, appeler hide () puis définir la boîte de dialogue sur null n'est pas non plus une alternative valide.
Lucas Tulio

Je connais vraiment le problème derrière cela. Mais appeler le renvoi () m'a aidé!
Karoly

59

Vous pouvez obtenir cette exception simplement par une erreur simple / stupide, en appelant (par exemple) accidentellement finish()après avoir affiché un AlertDialog, si vous manquez une instruction break break 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 finish()méthode fermera le Activity, mais le AlertDialogs'affiche toujours!

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


Plus ou moins exactement mon problème. Appelé terminer dans onError après la création de la boîte de dialogue, pas dans onClick pour le bouton de fermeture.
jbass

46

Les réponses à cette question étaient toutes correctes, mais un peu déroutantes pour moi de réellement 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' X has leaked window DecorView@d9e6131[]erreur a signifie qu'une boîte de dialogue était ouverte lorsque votre application a fermé. Mais pourquoi?

Il se peut que votre application se soit bloquée pour une autre raison alors que votre boîte de dialogue était ouverte.

Cela a conduit à la fermeture de votre application en raison d'un bogue dans votre code, ce qui a entraîné la fermeture de la boîte de dialogue en même temps que votre application en raison de l'autre erreur.

Alors, regardez à travers votre logique. Résolvez la première erreur, puis la deuxième erreur se résoudra d'elle-mêmeentrez la description de l'image ici

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


2
Je ne peux pas croire que cela n'ait qu'un seul vote positif .. ou nous sommes vraiment mauvais en programmation hahaha J'ai aussi aimé votre analogie domino
user2161301

Résolvez la première erreur et la deuxième erreur ne se produira pas . Cette analogie m'a aidé.
itabdullah

Ce n'est pas tout à fait vrai, des cas comme la rotation du téléphone peuvent également provoquer une rotation "d'activité".
Sreekanth Karumanaghat

36

Ce problème se produit lorsque vous essayez d'afficher une boîte de dialogue après avoir quitté une activité.

Je viens de résoudre ce problème en écrivant simplement le code suivant:

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

Fondamentalement, à partir de quelle classe vous avez commencé progressDialog, remplacez la méthode onDestroy et procédez de cette façon. Il a résolu le problème «L'activité a une fuite de fenêtre».


onDestroy n'est pas garanti d'être appelé. Mieux vaut mettre ce code dans onPause ou onStop
Amruta-Pani

19

J'ai récemment rencontré le même problème.

La raison de ce problème est que l'activité est fermée avant la fermeture de la boîte de dialogue. Il y a plusieurs raisons à cela. Ceux mentionnés dans les articles ci-dessus sont également corrects.

Je suis entré dans une situation, car dans le fil, j'appelais une fonction qui lançait une exception. À cause de quoi la fenêtre était fermée et donc l'exception.


16

Fermer la boîte de dialogue lorsque l'activité détruit

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}

si pDialog est nul, cela générera une erreur lorsque vous interrogerez l'état de la boîte de dialogue nulle
Jonathan Dunn

1
non, ce ne sera pas @JonDunn, car Java ne traitera pas le second booléen si le premier est faux
matdev

13

Cela pourrait aider.

if (! isFinishing()) {

    dialog.show();

    }

2
Parmi des centaines de réponses similaires, personne ne montre comment vérifier si des fenêtres existent. Vous me faites donc gagner du temps à trouver le moyen de le faire. Merci.
kolyaseg

11

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


J'ai remarqué que je faisais un mDialog.hide () avant l'appel finish (). Le changer en mDialog.dismiss () a fait l'affaire.
mays

11

J'obtenais ces journaux 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'avais l'habitude d'obtenir ces journaux une fois en quelques exécutions de manière aléatoire. De plus, ma candidature ne concerne aucun progressdialog. Enfin, j'ai contourné ce problème avec l'implémentation 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();
}

Remplacez le OnPauseavec appel à mVideoView.pause()et l'ensemble visibilityà GONE. De cette façon, je pourrais résoudre le problème " Activity has leaked window" d'erreur de journal.


je suis également confronté au même problème. j'ai ajouté ces lignes de code dans mon code mais cela n'a pas fonctionné et donne la même erreur "android.view.WindowLeaked qui a été ajouté à l'origine" et aussi ne
lit

10

J'avais le même problème et j'ai trouvé cette page, et bien que ma situation soit différente, j'ai appelé à finishpartir d'un ifbloc avant qu'il ne définisse la boîte d'alerte.

Donc, simplement appeler dismissne fonctionnerait pas (car il n'a pas encore été fait) mais après avoir lu la réponse d' Alex Volovoy et réalisé que c'était la boîte d'alerte qui en était la cause. J'ai essayé d'ajouter une déclaration de retour juste après la fin dans ce ifbloc et cela a résolu le problème.

Je pensais qu'une fois que vous aviez appelé terminer, il avait tout arrêté et terminé juste là, mais ce n'est pas le cas. Il semble aller à la fin du bloc de code dans lequel il se termine.

Donc, si vous voulez implémenter une situation où parfois cela se terminera avant de faire du code, vous devez mettre une déclaration de retour juste après la fin ou cela continuera et agira comme si la fin était appelée à la fin de la bloc de code pas où vous l'avez appelé. C'est pourquoi j'obtenais toutes ces erreurs étranges.

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'aie appelé terminer là-dedans, cela agira comme si vous l'aviez appelé après le alert.show();et donc il dirait que la fenêtre a fui en terminant juste après avoir fait apparaître la boîte de dialogue, même si c'est pas le cas, il le pense toujours.

Je pensais ajouter ceci comme ici car cela montre que la commande d'arrivée a agi différemment alors 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 de découvrir cela.


7

Ce n'est pas la réponse à la question mais elle est pertinente 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, toutes les vues utilisant ce contexte peuvent donner cette erreur.


Pouvez - vous raconter quelque chose de similaire pour progessdialog.show().. et progressdialog.hide()dans asynctaskla même activité au lieu de onPause()partir activity?? jetez un oeil à mon problème ... stackoverflow.com/questions/39332880/…
Bhuro

1
ça marche parfaitement pour moi: android: noHistory = "true"
Shohel Rana

6

Non seulement essayez d'afficher une alerte, mais elle peut également être invoquée lorsque vous terminez une instance particulière d'activité et essayez de démarrer une nouvelle activité / service ou essayez de l'arrêter.

Exemple:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));

6

Généralement, ce problème se produit en raison de la boîte de dialogue de progression: vous pouvez résoudre ce problème 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();
                }
            }

5

J'ai eu le problème où j'ai terminé une activité alors qu'un ProgressDialog était toujours affiché.

Alors, cachez d'abord la boîte de dialogue, puis terminez l'activité.


5

Essayez ce code:

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

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

}

progressdialog.dismiss();cela peut créer NullPointerException.
tpk

5

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

Essayez enfin d'ajouter une boîte de dialogue. Au premier contrôle et doInBackground()fonction de correction

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

Ce qui est arrivé à moi quand je me sers ProgressDialogdans AsyncTask. En fait, j'utilise la hide()méthode onPostExecute. Sur la base de la réponse de @Alex Volovoy, je dois utiliser dismiss()avec ProgressDialogpour le supprimer dans onPostExecute et c'est fait.

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

progressDialog.dismiss(); // Use it

Ce n'est pas vraiment la réponse complète. Il existe deux façons de divulguer une boîte de dialogue. 1) Si vous avez un AsyncTasket que vous affichez le Dialog, alors quelque chose se produit qui fait l' Activityappel onPause()(peut-être une logique dans votre AsyncTask lui-même, comme un auditeur, alors il fuira. 2) Comme mentionné ci-dessus, le Dialogqui a été créé avec cela Activity Contextn'est jamais rejeté et les Activityprogrès.
tricknology

5

L' Activity has leaked window that was originally added...erreur " " se produit lorsque vous essayez d'afficher une alerte après que le Activitysoit effectivement finished.

Vous avez deux options AFAIK:

  1. Repensez le login de votre alerte: appelez dismiss()ledialog avant de quitter réellement votre activité.
  2. Mettez le dialogdans un thread différent et exécutez-le thread(indépendamment du courant activity).

5

voici une solution lorsque vous voulez fermer AlertDialog mais ne voulez pas y faire référence dans l'activité.

la solution nécessite que vous ayez androidx.lifecycle dépendance dans votre projet (je crois qu'au moment du commentaire, c'est une exigence courante)

cela vous permet de déléguer le rejet de la boîte de dialogue à un objet externe (observateur), et vous n'avez plus besoin de vous en soucier, car il est automatiquement désabonné lorsque l'activité se termine. (voici la preuve: https://github.com/googlecodelabs/android-lifecycles/issues/5 ).

ainsi, l'observateur conserve la référence au dialogue et l'activité conserve la référence à l'observateur. lorsque "onPause" se produit - l'observateur rejette la boîte de dialogue et lorsque "onDestroy" se produit - l'activité supprime l'observateur, donc aucune fuite ne se produit (enfin, au moins je ne vois plus d'erreur dans logcat)

// observer
class DialogDismissLifecycleObserver( private var dialog: AlertDialog? ) : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        dialog?.dismiss()
        dialog = null
    }
}
// activity code
private fun showDialog() {
        if( isDestroyed || isFinishing ) return
        val dialog = AlertDialog
            .Builder(this, R.style.DialogTheme)
            // dialog setup skipped
            .create()
        lifecycle.addObserver( DialogDismissLifecycleObserver( dialog ) )
        dialog.show()
}

4

Les exceptions de fuite de fenêtre ont deux raisons:

1) montrant la boîte de dialogue lorsque le contexte d'activité n'existe pas, pour résoudre ce problème, vous devez afficher la boîte de dialogue uniquement si vous êtes sûr que l'activité existe:

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

2) ne fermez pas la boîte de dialogue de manière appropriée, pour résoudre, utilisez ce code:

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

4

Vous devez créer un Progressdialogobjet dans la onPreExecuteméthode de AsyncTasket vous devez le faire dismissdans la onPostExecuteméthode.


4

La meilleure solution consiste simplement à ajouter une boîte de dialogue pour essayer d'intercepter et de fermer la boîte de dialogue lorsqu'une exception se produit

Utilisez simplement le code ci-dessous

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }

3
n'est pas le dialogue sera nul après avoir appelé terminé?, je pense que dialog.dismiss()cela produira aussi une erreur
Ashu Kumar

3

Dans mon cas, la raison était que j'avais oublié d'inclure une autorisation dans le fichier manifeste Android.

Comment ai-je découvert? Eh bien, comme @Bobby le dit dans un commentaire sous la réponse acceptée, faites défiler vers le haut jusqu'à vos journaux et vous verrez la première raison ou l'événement qui a vraiment déclenché l'exception. Apparemment, le message "L'activité a fui la fenêtre qui a été ajoutée à l'origine" n'est qu'une exception résultant de la première exception.


3

Essayez le code ci-dessous, cela fonctionnera à chaque fois que vous fermerez la boîte de dialogue de progression 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

La meilleure solution est de mettre ceci avant d'afficher progressbarouprogressDialog

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

  //Show Your Progress Dialog

}

Ça ne marche pas pour moi. J'ai Dialog.show () après la réponse de l'appel HTTP et quand entre-temps je tourne l'écran Activity est détaché mais il semble que isShown == true avant Dialog.show () puis Dialog se bloque malgré cette vérification
Michał Ziobro

1

Assurez-vous simplement que votre activité ne se ferme pas de façon inattendue en raison de certaines exceptions levées quelque part dans votre code. Généralement, cela se produit dans une tâche asynchrone lorsque l'activité fait face à une fermeture forcée dans la méthode doinBackground, puis que asynctask retourne à la méthode onPostexecute.


1

J'ai une autre solution pour cela, et je voudrais savoir si cela vous semble valable: au lieu de rejeter dans onDestroy, qui semble être la solution principale, j'étends ProgressDialog ...

public class MyProgressDialog extends ProgressDialog {

  private boolean isDismissed;

  public MyProgressDialog(Context context) {
    super(context);
  }

  @Override
  public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    dismiss();
  }

  @Override
  public void dismiss() {
    if (isDismissed) {
      return;
    }
    try {
      super.dismiss();
    } catch (IllegalArgumentException e) {
      // ignore
    }
    isDismissed = true;
  }

C'est préférable, AFAIC, car vous n'avez pas besoin de maintenir la boîte de dialogue de progression en tant que membre, il suffit de tirer (afficher) et d'oublier

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.