2016-12-26 1 views
0

J'ai obtenu une classe qui gère une création de boîte de dialogue et d'affichage dans mon application.Handlind dialogue Android dont le contexte est détruit

Il a obtenu une boîte de dialogue en tant que membre de la classe et une méthode qui a les lignes suivantes:

public static void setAlertDialog(String title, final Context con, boolean dialogCancelable) 
{ 
    if(myDialog == null) 
    { 
     myDialog = new Dialog(con); 
    ... 
} 

Le contexte peut être détruit après un certain temps (par une action de l'application qui signifie son pas rare) , puis je reçois une exception de

Impossible d'ajouter la fenêtre - token [email protected] n'est pas valide; Votre activité est-elle en cours?

Depuis la boîte de dialogue reste la même instance, une solution qui suggère de faire ce qui suit ne fonctionnera pas:

if(!((Activity)con).isFinishing()) 
{ 
     myDialog.show(); 
} 

Je l'ai fixé pour l'instant avec la simple création d'une nouvelle instance de la boîte de dialogue chaque fois que je l'utilise .

La question est de savoir si mon correctif est correct ou s'il existe de meilleures façons de gérer cette situation?

Répondre

1

Je voudrais un peu plus de contexte sur la façon dont setAlertDialog est appelée en conjonction avec l'affichage de la boîte de dialogue. Puisque l'activité est en train d'être détruite, il semble que le dialogue soit probablement affiché à partir d'une tâche asynchrone.

En outre, quel est votre raisonnement pour conserver la boîte de dialogue en tant que variable d'instance? Habituellement, ceci est fait pour que la boîte de dialogue puisse être nettoyée lors de la pause ou de la destruction du Activity.

TlDr; Votre réparation semble bien.

La version longue (faire quelques hypothèses):

Dans mes expériences, vous voulez généralement de gérer la création et montrant une boîte de dialogue en même temps. Si vous ne voulez pas créer la boîte de dialogue plusieurs fois (et vous ne prévoyez pas de détruire la Activity entre la création et la boîte de dialogue montrant) quelque chose comme ce qui suit devrait fonctionner:

if(!((Activity) context).isFinishing()){ 
    if (myDialog == null) { 
    myDialog = new Dialog(context); 
    } 
    myDialog.show(); 
} 

puis en ajoutant ce qui suit à le Activity pour vous assurer que le dialogue est nettoyé:

@Override 
protected void onDestroy() { 
    // Dismiss any dialogs to avoid leaking windows. 
    if (myDialog != null && myDialog.isShowing()) { 
    myDialog.dismiss(); 
    // This is optional, but would keep you from having the context 
    // issue if you are still having it and don't mind re-creating 
    // the dialog each time. 
    myDialog = null; 
    } 

    super.onDestroy(); 
}