web-dev-qa-db-fra.com

Durée de vie statique singleton en Android

J'ai une situation peu claire:

Les singletons statiques seront-ils récupérés après la destruction de la dernière activité de détention de référence? Parce qu'il n'y a plus de références dans Application à une instance singleton. Puis-je alors compter sur des singletons?

Par officiel Android doc :

Il n'est normalement pas nécessaire de sous-classer Application. Dans la plupart des situations, les singletons statiques peuvent fournir les mêmes fonctionnalités de manière plus modulaire.

Par quelque poste:

https://web.archive.org/web/20160729201921/http://www.devahead.com/blog/2011/06/extending-the-Android-application-class-and-dealing-with- singleton /

Lors du développement d’une application, , j’ai constaté que parfois certaines variables statiques liées aux activités n’étaient pas initialisées même si elles avaient déjà été initialisées ! Je pensais que lorsqu'une variable statique était initialisée, elle le restait pendant toute la durée de vie de l'application, mais cela ne semble pas être le cas.

En d'autres termes, si rien ne contient une référence à ma classe singleton statique, qu'est-ce qui l'empêche d'être récupéré et détruit?

29
Arvis

Non, car s'il s'agit d'un singleton, il est stocké sous la forme d'un champ static dans sa classe, et généralement les singletons ne sont pas détruits par les clients, c'est-à-dire que vous ne mettriez pas une méthode statique deleteInstance() qui définit la référence à null pour que si personne d'autre ne l'utilise, il est éligible pour le garbage collection. Pour les champs statiques, la récupération de place se produira lorsque le chargeur de classe qui a chargé la classe est ignoré.

Pour cette raison, le mot clé static lui-même peut provoquer des fuites de mémoire, s'il fait référence à des objets Activity, vous devez donc être très prudent lors de son utilisation.

15
Raffaele

Oui. Chaque fois que vous quittez votre application (par exemple, votre application ouvre l'application appareil photo pour prendre une photo, ou ouvre le navigateur pour ouvrir un lien, ou l'utilisateur appuie simplement sur le bouton de retour), il est possible que votre Application l'objet sera détruit et recréé lorsque vous reviendrez à votre application.

Vous devez initialiser toute variable statique dans un static {} bloquer dans votre classe Application personnalisée si vous en avez une, ou dans votre Activities pour vous assurer qu'ils ne seront pas nuls.

Notez qu'il est plus probable de rencontrer ce problème sur des appareils avec un matériel plus faible, une mémoire inférieure, mais vous devez vous attendre à ce que cela puisse se produire sur n'importe quel appareil.

En fin de compte, dans Android, ne vous attendez pas à ce que vos variables statiques restent en mémoire à tout moment. Vérifiez toujours s'ils existent et réinitialisez-les si nécessaire aux bons endroits.

MODIFIER:

Je sais que cela fait longtemps, et j'ai complètement oublié ce fil, de toute façon, voici la source de la documentation officielle Android cycle de vie:

http://developer.Android.com/training/basics/activity-lifecycle/recreating.html

6
Adam L. Mónos

Vous ne pouvez pas contrôler quand exactement Java deviennent récupérés. Un objet devient éligible pour la collecte des ordures lorsqu'il n'y a plus de références (non circulaires). Avec Android, en outre, vous ne pouvez pas contrôler quand votre activité est supprimée de la mémoire.

les singletons sont censés représenter quelque chose qui existe toujours.

  • Vous ne pouvez pas forcer un objet à être récupéré; vous pouvez demander que le garbage collector s'exécute avec System.gc() mais ce n'est qu'une demande.

  • Si vous voulez rendre un "singleton" éligible pour le garbage collection, vous voudrez probablement avoir une méthode pour définir la variable statique sur null (et espérer que rien d'autre n'a pris une copie de la référence). De toute évidence, la prochaine fois que quelqu'un demandera une instance, celle-ci devra être recréée. à ce moment-là, ce n'est pas vraiment un singleton, bien sûr.

3
Sahil Mahajan Mj