2015-09-06 4 views
2

Supposons que j'ai une application Android avec deux activités (Activité1 et Activité2). Dans Activity1, je déclare un public static Boolean foo = true.Durée de vie d'une variable statique publique dans Android

Quand je finish() Activité1 et passer à Activity2, je suis en mesure de voir cette variable « foo » a une valeur true

Mais lorsque le système a peu de mémoire (par exemple, parce qu'il ya de nombreuses applications en cours d'exécution sur l'appareil), puis , quand je suis sur Activity2, je vois que la valeur de la variable "foo" est null.

Comment cela est-il expliqué?

+2

La réponse à cette question pourrait être la solution à votre problème. http://stackoverflow.com/questions/9541688/static-variable-null-when-returning-to-the-app – HyperZ

+0

Ce que je ne comprends pas, c'est quand je finis() Activity1, pourquoi puis-je voir la valeur de "foo" est vrai, et quand le système le tue, la valeur de "foo" est nulle. – Fivos

+0

Probablement parce que 'null' est la valeur par défaut pour votre variable statique 'foo', comme indiqué dans la réponse de @Kishan Vaghela. – HyperZ

Répondre

4

Il est important de noter que la durée de vie d'une variable statique est liée au processus pas l'activité . Même si votre activité est détruite, la variable statique sera toujours active (c'est pourquoi vous voyez que sa valeur est true). Ce n'est que lorsque le processus est détruit que la variable statique sera libérée correctement.

C'est également une des raisons pour lesquelles vous ne devriez pas utiliser de variables statiques pour contenir des références à des activités, des contextes ou des vues. D'énormes fuites de mémoire attendent de se produire.

Pour votre scénario particulier, cela signifie que:

  • Loi1 créé & définissez la variable; Vous avez déménagé de Loi1 à ACT2
  • Les processus sont tués dans le BG
  • Lorsque le système tente de vous restaurer, vous finissez par revenir à Loi2
  • Cependant, depuis l'initialisation de cette variable est arrivé à Loi1, (qui n'a pas été initialisé) la variable n'est pas définie.
+0

Merci @Colt McAnlis pour votre réponse définitive. Dans le senario que le processus a été détruit, et je suis dans l'activité 2 de l'application pourquoi la variable est nulle? Mon activité de lancement est Activity1, donc la variable "foo" devrait déjà avoir été initialisée de nouveau à 'true' avant de passer à Activity2. Qu'est-ce que je rate? – Fivos

+1

J'ai modifié ma réponse pour être plus spécifique à votre scénario. –

0

Si le processus est arrêté, toutes les variables statiques seront réinitialisées à leurs valeurs par défaut.

Donc quelle que soit la valeur que vous avez définie dans Activité1 ne persistera pas

+0

Je pense que le processus n'est pas tué, car alors mon application serait également tué. Voulez-vous dire que Activity1 est tué? – Fivos

+1

Il est très probable que votre processus ** soit tué **. 'Votre application est en fait très souvent tuée si une autre application avec une priorité plus élevée (généralement, si elle est au premier plan c'est une priorité plus élevée) a besoin des ressources.Cela est dû à la nature des appareils mobiles ayant des ressources relativement limitées. »-> http://stackoverflow.com/questions/9541688/static-variable-null-whenreturning-to-the-app Veuillez également lire les commentaires. .. – HyperZ

+0

J'ai dit plus haut que je pense que le processus n'est pas tué parce que mon application est au premier plan quand cela arrive, donc si le processus a été tué, mon application se fermerait. – Fivos

0

Vous avez appelé variable statique pour la classe d'activité, variable de classe name.static.

Class1:

Public class1 extends Activity{Public static boolean foo = true;} 

Classe2: appel Class1 variables

Public class2 extends Activity { class1.foo // call variable } 
+1

En quoi cela répond-il à la question du PO? L'OP sait déjà comment appeler une variable car il est capable de voir la valeur de 'foo'. Cependant, il ne sait pas pourquoi sa valeur est soudainement nulle. – HyperZ