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)
Pentium10
la source
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 ()

Alex Volovoy
la source
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.

molnarm
la source
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 :-)

ggomeze
la source
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.

Mark Phillip
la source
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. :)

Adrian Romanelli
la source
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!

Ruchir Baronia
la source
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».

Shoaib Ahmed
la source
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.

Tushar
la source
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();
    }
}
Muhammad Aamir Ali
la source
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();

    }
sablonneux
la source
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.

Melinda Green
la source
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.

InvisiblePoint
la source
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.

Kit Ramos
la source
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.

Tueur
la source
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));
Kulbhushan Chaskar
la source
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();
                }
            }
Bapusaheb Shinde
la source
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é.

LeonS
la source
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
    }

}
tinku
la source
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();
NickUnuchek
la source
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
SANAT
la source
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).
Kyle Clegg
la source
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()
}
dmz9
la source
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();
}
}
Sherry
la source
4

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

ammad
la source
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();
    }
Ness Tyagi
la source
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.

Matthew Quiros
la source
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();
    }
Développeur
la source
2

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

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

  //Show Your Progress Dialog

}
Ali Akram
la source
Ç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.

Manas Ranjan
la source
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

Kalisky
la source