493 votes

À l’aide de contexte d’Application partout ?

Dans une application Android, y a-t-il quelque chose de mal avec l’approche suivante :

et passez-la dans le monde (p. ex. SQLiteOpenHelper) où le contexte est obligatoire (et ne fuit ne pas bien sûr) ?

428voto

Reto Meier Points 55904

Il ya un couple de problèmes potentiels de cette approche, bien que dans beaucoup de circonstances (comme dans votre exemple), il va bien travailler.

En particulier, vous devez être prudent lorsque vous traitez avec tout ce qui traite de l'interface graphique qui nécessite un Contexte. Par exemple, si vous passez le Contexte de l'application dans l' LayoutInflator vous aurez une Exception. En règle générale, votre approche est excellent: il est de bonne pratique d'utiliser une Activité de Cadre au sein de cette Activité, et le Contexte de l'Application lors du passage d'un contexte au-delà de la portée de l'Activité, afin d' éviter les fuites de mémoire.

Aussi, comme une alternative à votre rythme, vous pouvez utiliser le raccourci de l'appel d' getApplicationContext() sur un objet de Contexte (par exemple une Activité) pour obtenir le Contexte de l'Application.

30voto

snctln Points 8687

Dans mon expérience, cette approche ne devrait pas être nécessaire. Si vous avez besoin du contexte pour tout ce que vous pouvez généralement obtenir via un appel à Vue.getContext() et en utilisant le Contexte y est obtenu, vous pouvez appeler Contexte.getcontexteapplication() pour obtenir le contexte de l'Application. Si vous essayez d'obtenir l'Application de contexte à partir d'une Activité, vous pouvez toujours faire appel à l'Activité.getApplication() qui doit être en mesure d'être passé comme le Contexte nécessaire pour un appel à SQLiteOpenHelper()

Dans l'ensemble, il ne semble pas être un problème avec votre approche de cette situation, mais lorsque l'on traite avec le Contexte, assurez-vous que vous n'êtes pas une fuite de la mémoire de n'importe où, comme décrit sur la page officielle de Google Android, les Développeurs blog

14voto

Certaines personnes ont demandé: comment le singleton retourner un pointeur null? Je vais répondre à cette question. (Je ne peux pas répondre dans un commentaire parce que j'ai besoin de code postal.)

Elle peut renvoyer null entre les deux événements: (1) la classe est chargée, et (2) l'objet de cette classe est créée. Voici un exemple:

class X {
    static X xinstance;
    static Y yinstance = Y.yinstance;
    X() {xinstance=this;}
}
class Y {
    static X xinstance = X.xinstance;
    static Y yinstance;
    Y() {yinstance=this;}
}

public class A {
    public static void main(String[] p) {
    X x = new X();
    Y y = new Y();
    System.out.println("x:"+X.xinstance+" y:"+Y.yinstance);
    System.out.println("x:"+Y.xinstance+" y:"+X.yinstance);
    }
}

Nous allons exécuter le code:

$ javac A.java 
$ java A
x:X@a63599 y:Y@9036e
x:null y:null

La deuxième ligne indique que Y. xinstance et X. yinstance sont null; ils sont nuls parce que les variables X. xinstance sna Y. yinstance ont été lues lorsqu'elles sont nulles.

Cela peut-il être fixé? Oui,

class X {
    static Y y = Y.getInstance();
    static X theinstance;
    static X getInstance() {if(theinstance==null) {theinstance = new X();} return theinstance;}
}
class Y {
    static X x = X.getInstance();
    static Y theinstance;
    static Y getInstance() {if(theinstance==null) {theinstance = new Y();} return theinstance;}
}

public class A {
    public static void main(String[] p) {
    System.out.println("x:"+X.getInstance()+" y:"+Y.getInstance());
    System.out.println("x:"+Y.x+" y:"+X.y);
    }
}

et ce code ne montre aucune anomalie:

$ javac A.java 
$ java A
x:X@1c059f6 y:Y@152506e
x:X@1c059f6 y:Y@152506e

MAIS ce n'est pas une option pour l'Androïde Application objet: le programmeur n'a pas de contrôle sur le moment où il est créé.

Une fois de plus: la différence entre le premier exemple et le deuxième est que le deuxième exemple, on crée une instance si la statique pointeur est null. Mais un programmeur ne peut pas créer l' application Android de l'objet avant que le système décide de le faire.

9voto

Prasanta Points 245

Vous essayez de créer un wrapper pour obtenir le contexte de l’Application et il y a une possibilité qu’elle peut retourner la " `` " pointeur.

Selon ma compréhension, je suppose que la meilleure approche pour call - aucun des 2 ou .

5voto

Martin Points 3543

C’est une bonne approche. Je l’utilise moi-même ainsi. Je dirais seulement pour substituer `` pour définir le singleton au lieu d’utiliser un constructeur.

Et puisque vous avez mentionné : en vous pouvez ouvrir la base de données aussi bien.

Personnellement, je pense que la documentation est trompés en disant qu' il n’y a normalement pas besoin de la sous-classe Application. Je pense que l’inverse est vrai : vous devez toujours sous-classe Application.

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