Rappelant ce post énumérant plusieurs problèmes d'utilisation de singletons et ayant vu plusieurs exemples d'applications Android utilisant le modèle singleton, je me demande si c'est une bonne idée d'utiliser Singletons au lieu d'instances uniques partagées via l'état d'application global (sous-classe android.os.Application et l'obtenir) via context.getApplication ()).
Quels avantages / inconvénients les deux mécanismes auraient-ils?
Pour être honnête, je m'attends à la même réponse dans ce modèle post singleton avec application Web, ce n'est pas une bonne idée! mais appliqué à Android. Ai-je raison? Qu'est-ce qui est différent dans DalvikVM autrement?
EDIT: Je voudrais avoir des avis sur plusieurs aspects impliqués:
- Synchronisation
- Réutilisabilité
- Essai
la source
Je recommande vivement les singletons. Si vous avez un singleton qui a besoin d'un contexte, ayez:
Je préfère les singletons à Application car cela aide à garder une application beaucoup plus organisée et modulaire - au lieu d'avoir un endroit où tout votre état global à travers l'application doit être maintenu, chaque pièce séparée peut prendre soin d'elle-même. Le fait que les singletons initialisent paresseusement (à la demande) au lieu de vous guider sur la voie de faire toute l'initialisation à l'avance dans Application.onCreate () est également bon.
Il n'y a rien de intrinsèquement mauvais à utiliser des singletons. Utilisez-les correctement, quand cela a du sens. Le cadre Android en a beaucoup, pour qu'il conserve des caches par processus des ressources chargées et d'autres choses de ce genre.
De plus, pour les applications simples, le multithreading ne devient pas un problème avec les singletons, car par conception, tous les rappels standard vers l'application sont distribués sur le thread principal du processus afin que le multi-threading ne se produise que si vous l'introduisez explicitement via les threads ou implicitement en publiant un fournisseur de contenu ou un service IBinder sur d'autres processus.
Réfléchissez simplement à ce que vous faites. :)
la source
De: Développeur> référence - Application
la source
L'application n'est pas la même que pour le Singleton, pour les raisons suivantes:
la source
J'ai eu le même problème: Singleton ou créer une sous-classe android.os.Application?
J'ai d'abord essayé avec le Singleton mais mon application à un moment donné appelle le navigateur
et le problème est que, si le combiné n'a pas assez de mémoire, la plupart de vos classes (même les singletons) sont nettoyées pour obtenir de la mémoire donc, lors du retour du navigateur vers mon application, il se bloquait à chaque fois.
Solution: placez les données nécessaires dans une sous-classe de la classe Application.
la source
Considérez les deux en même temps:
De plus, je suggère que vous développiez votre Context pour inclure non seulement l'accès aux objets singleton mais certaines fonctionnalités qui doivent être accessibles globalement, comme par exemple: context.logOffUser (), context.readSavedData (), etc. Renommer probablement le Context en La façade aurait alors un sens.
la source
Ils sont en fait les mêmes. Il y a une différence que je peux voir. Avec la classe Application, vous pouvez initialiser vos variables dans Application.onCreate () et les détruire dans Application.onTerminate (). Avec singleton, vous devez vous baser sur la statique d'initialisation et de destruction de VM.
la source
Mes 2 cents:
J'ai remarqué que certains champs singleton / statiques ont été réinitialisés lorsque mon activité a été détruite. J'ai remarqué cela sur certains appareils bas de gamme 2.3.
Mon cas était très simple: je viens d'avoir un dossier privé "init_done" et une méthode statique "init" que j'ai appelée depuis activity.onCreate (). Je remarque que la méthode init se réexécutait sur une certaine recréation de l'activité.
Bien que je ne puisse pas prouver mon affirmation, cela peut être lié à QUAND le singleton / classe a été créé / utilisé en premier. Lorsque l'activité est détruite / recyclée, il semble que toutes les classes auxquelles seule cette activité fait référence sont également recyclées.
J'ai déplacé mon instance de singleton vers une sous-classe d'application. Je les accède depuis l'instance d'application. et, depuis lors, n'a plus remarqué le problème.
J'espère que cela peut aider quelqu'un.
la source
De la bouche du cheval proverbial ...
Lors du développement de votre application, il peut s'avérer nécessaire de partager des données, du contexte ou des services à l'échelle mondiale dans votre application. Par exemple, si votre application contient des données de session, telles que l'utilisateur actuellement connecté, vous souhaiterez probablement exposer ces informations. Dans Android, le modèle de résolution de ce problème est que votre instance android.app.Application possède toutes les données globales, puis traite votre instance Application comme un singleton avec des accesseurs statiques pour les divers services et données.
Lorsque vous écrivez une application Android, vous êtes assuré de n'avoir qu'une seule instance de la classe android.app.Application, et il est donc sûr (et recommandé par l'équipe Google Android) de la traiter comme un singleton. Autrement dit, vous pouvez ajouter en toute sécurité une méthode statique getInstance () à votre implémentation d'application. Ainsi:
la source
Mon activité appelle finish () (ce qui ne le fait pas terminer immédiatement, mais le fera éventuellement) et appelle Google Street Viewer. Lorsque je le débogue sur Eclipse, ma connexion à l'application se brise lorsque Street Viewer est appelé, ce que je comprends comme la fermeture de l'application (entière), soi-disant pour libérer de la mémoire (car une seule activité terminée ne devrait pas provoquer ce comportement) . Néanmoins, je suis capable d'enregistrer l'état dans un bundle via onSaveInstanceState () et de le restaurer dans la méthode onCreate () de l'activité suivante dans la pile. Soit en utilisant un singleton statique ou une application de sous-classement, je fais face à la fermeture et à la perte de l'application (sauf si je la sauvegarde dans un bundle). Donc, d'après mon expérience, ils sont les mêmes en ce qui concerne la préservation de l'État. J'ai remarqué que la connexion est perdue dans Android 4.1.2 et 4.2.2 mais pas sur 4.0.7 ou 3.2.4,
la source