web-dev-qa-db-fra.com

Utilisation de variables statiques dans Android

Sous Android, l'utilisation de variables statiques est-elle une pratique recommandée? Par exemple, en implémentant un modèle Singleton en Java, je fais habituellement:

private static A the_instance;
public static A getInstance() {
    if (the_instance == null) {
       the_instance = new A();
    }
    return the_instance;
}

De plus, quand cela est-il nettoyé par la JVM Android?

Merci.

55
michael

Les champs static sont attachés à l'instance Class dans son ensemble, qui est à son tour attachée à ClassLoader qui a chargé la classe. the_instance serait déchargé lorsque l'intégralité de ClassLoader serait récupérée. Je suis sûr à 90% que cela se produit lorsque Android détruit l'application (pas lorsqu'elle passe en arrière-plan ou s'arrête, mais est complètement arrêtée.)

Alors, pensez-y comme vivant tant que votre application fonctionne. Singleton est-il une bonne idée? Les gens ont des opinions différentes. Je pense que c'est bien lorsqu'il est utilisé correctement, moi-même. Je ne pense pas que la réponse change beaucoup sur Android. L'utilisation de la mémoire n'est pas le problème en soi; si vous devez charger un tas de trucs en mémoire, c'est soit un problème, soit ce n'est pas le cas, que vous encapsuliez ou non les données dans un Singleton.

63
Sean Owen

Je pense que les variables statiques sont OK.

Voici ce que Android doc dit:

http://developer.Android.com/guide/appendix/faq/framework.html

Comment puis-je transmettre des données entre des activités/services dans une seule application?

Un champ/méthode statique public

Une autre façon de rendre les données accessibles à travers les activités/services consiste à utiliser des champs et/ou des méthodes statiques publics. Vous pouvez accéder à ces champs statiques à partir de n'importe quelle autre classe de votre application. Pour partager un objet, l'activité qui crée votre objet définit un champ statique pour pointer vers cet objet et toute autre activité qui souhaite utiliser cet objet accède simplement à ce champ statique.

15
user256239

Je ne sais pas si une telle approche est bonne pour la plate-forme mobile où vous disposez d'une mémoire limitée. Sans oublier que l'application sera exécutée sur un appareil compatible multitâche.

Je pense que cette approche peut monopoliser la mémoire de l'appareil, mais je n'ai aucun document à l'appui. Peut-être que quelqu'un qui est plus instruit que moi peut partager ses pensées.

0
RobGThai

Contrairement à ce que disent les autres - c'est plus que correct. Certes, il a une certaine structure. Dans le référentiel officiel googlesamples/Android-architecture, il est utilisé sous todo-mvp-clean (application Todo implémentant le modèle MVP et suivant les principes de l'architecture propre). Découvrez ceci fichier .

Ce que vous pouvez voir, c'est un grand nombre de méthodes statiques référençant les getters singleton.

Le cadre Dagger DI est une alternative moderne, moins sujette aux erreurs et pratique.

0
Mikel