668 votes

Lancement de boîte de dialogue "Impossible d'ajouter une fenêtre - le token null n'est pas pour une application" avec getApplication () comme contexte

Mon Activité est d'essayer de créer un AlertDialog qui nécessite un Contexte en tant que paramètre. Cela fonctionne comme prévu si j'utilise:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

Cependant, je suis réticent à l'idée de l'utilisation de "ce" en tant que contexte, en raison du risque de fuites de mémoire lorsque l'Activité est détruit et recréé même au cours de quelque chose de simple comme une rotation de l'écran. À partir d'un poste sur l'Android developer blog:

Il existe deux façons simples pour éviter de contexte liés à des fuites de mémoire. Le plus évident est d'éviter d'échapper au contexte, à l'extérieur de son propre champ. L'exemple ci-dessus a montré le cas de référence statique mais intérieur des classes et de leur référence implicite à l'extérieur de la classe peuvent être tout aussi dangereux. La deuxième solution est d'utiliser le contexte de l'Application. Ce contexte va vivre aussi longtemps que votre application est en vie et ne dépend pas de la activités du cycle de vie. Si vous avez l'intention de les garder à long terme des objets qui ont besoin d'un contexte, rappelez-vous l'objet application. Vous pouvez l'obtenir facilement en appelant le Contexte.getcontexteapplication() ou de l'Activité.getApplication().

Mais pour l'AlertDialog() ni getcontexteapplication() ou getApplication() est acceptable en tant que Contexte, il lève l'exception: "Impossible d'ajouter la fenêtre du jeton de la valeur null n'est pas pour une application" par les références: 1, 2, 3, etc.

Alors, faut-il vraiment être considéré comme un "bug", puisque nous sommes officiellement conseillé d'utiliser de l'Activité.getApplication() et pourtant il ne fonctionne pas comme annoncé?

Jim

1357voto

Steven L Points 3892

Au lieu de getApplicationContext() , utilisez simplement ActivityName.this .

193voto

TrueGuidance Points 1161

L'utilisation de " this " n'a pas fonctionné pour moi, mais " MyActivityName.this " a fonctionné. J'espère que cela aidera tous ceux qui ne pourraient pas obtenir « this » à travailler.

34voto

Kevin TeslaCoil Points 4273

Votre boîte de dialogue ne devrait pas être une longue durée de vie de l'objet qui a besoin d'un cadre". La documentation est source de confusion. En gros, si vous faites quelque chose comme:

static Dialog sDialog;

(note de la statique)

Puis, dans une activité, quelque part, vous n'

 sDialog = new Dialog(this);

Vous seriez probablement des fuites de l'activité d'origine au cours d'une rotation ou similaire qui permettrait de détruire l'activité. (À moins que vous nettoyer en onDestroy, mais dans ce cas, vous ne serait probablement pas faire l'objet de Dialogue statique)

Pour certaines structures de données, il serait logique de les rendre statique et en fonction de la demande du contexte, mais généralement pas pour de l'INTERFACE utilisateur, comme les boîtes de dialogue. Donc quelque chose comme ceci:

Dialog mDialog;

...

mDialog = new Dialog(this);

Est bien et ce qui n'a pas de fuite de l'activité que de mDialog serait libéré avec l'activité, car elle n'est pas statique.

20voto

P_Pran Points 136

En Activity sur le clic du bouton montrant une boîte de dialogue

 Dialog dialog = new Dialog(MyActivity.this);
 

A travaillé pour moi.

18voto

lassana Points 1551

Petit piratage: vous pouvez éviter de détruire l'activité par GC (Bien sûr, vous ne devriez pas le faire, mais cela peut aider dans certaines situations):

 public class PostActivity extends Activity  {
    ...
    private Context contextForDialog = null;
    ...
    public void onCreate(Bundle savedInstanceState) {
        ...
        contextForDialog = this;
    }
    ...
    private void showAnimatedDialog() {
        mSpinner = new Dialog(contextForDialog);
        mSpinner.setContentView(new MySpinner(contextForDialog));
        mSpinner.show();
    }
    ...
}
 

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