2010-09-08 5 views
1

Dans mon application, j'ai besoin de données qui sont accessibles pour quelques activités. J'ai lu qu'une bonne solution est d'utiliser la classe Application pour cela. Donc, je l'utilise comme ceci:Accès Classe d'application de la classe autre que l'activité

public class MyApplication extends Application { 

    private String str; 

    public String getStr(){ 
    return str; 
    } 
    public void setStr(String s){ 
    str = s; 
    } 
} 

et je peux accéder à cette variable d'activité comme celle-ci:

MyApplication appState = ((MyApplication)getApplicationContext()); 
String str = appState.getStr(); 

Il est ok, mais j'ai aussi classe parser xml:

public class MyXMLHandler extends DefaultHandler { 

et si j'essaie de faire la même chose ici

MyApplication app = ((MyApplication)getApplicationContext()); 
    String str = app.getStr(); 

Je reçois The method getApplicationContext() is undefined for the type MyXMLHandler

Comment puis-je accéder à ma variable?

Répondre

4

Eh bien, généralement une classe d'analyseur XML devrait être indépendante de tout contexte spécial. Cela signifie qu'un développeur devrait être capable de l'utiliser, qu'il développe une application, un service ou une bibliothèque ou quoi que ce soit. La classe d'analyseur XML ne doit faire aucune hypothèse quant au contexte dans lequel elle est utilisée et d'où elle obtient des paramètres (vous limiteriez votre analyseur à fonctionner uniquement s'il a accès à une instance Application). L'analyseur ne doit pas extraire ses paramètres, les paramètres doivent être définis par l'appelant.

Vous ne souhaitez pas que votre classe d'analyseur XML affiche des messages à l'utilisateur, n'est-ce pas? À droite: "Qu'est-ce qu'un analyseur XML doit faire avec les interfaces utilisateur?" Au lieu de cela, vous devez lever les exceptions et vous assurer qu'elles sont gérées correctement, par exemple selon qu'il existe ou non une interface utilisateur (consignation). Par conséquent, vous devez transmettre les paramètres dont vous avez besoin lors de la construction d'une instance de votre analyseur XML. Mais pas passez votre instance d'application en paramètre (pensez encore aux dépendances), mais vous passez les paramètres nécessaires à partir de votre classe d'application.

Dans votre exemple ci-dessus:

MyApplication app = ((MyApplication)getApplicationContext()); 
MyXmlHandler handler = new MyXmlHandler(app.getStr()); 

Vous devriez vraiment vous assurer de garder « trucs outil » distinct de tout ce qui pourrait vous empêcher d'utiliser universellement. Que se passerait-il si vous vouliez utiliser votre classe XML Parser dans un autre projet où votre paramètre n'est pas fourni par le contexte de l'application mais par une autre classe?

Je suis sûr que vous pouvez avoir une discussion d'une semaine sur la conception orientée objet et comment les choses devraient se faire - mais c'est fondamentalement la façon dont je le ferais ...

+0

Ok, merci, je pense que vous avez raison. Je ne voulais pas passer de paramètres du contexte à l'analyseur, je voulais juste que l'analyseur interprète les résultats de l'analyse en classe Application, car j'ai besoin de ces résultats dans quelques activités. Je vais le faire dans l'autre sens, je vais retourner les résultats de l'analyseur à l'activité de l'appelant, puis les écrire à l'application. Est-ce une approche correcte? Merci – Burjua

+0

Eh bien, ça me semble bien :-) –

+0

Ok, merci)) – Burjua

0

Thorsten est juste, mais Si vous décidez toujours d'utiliser votre application, vous pouvez utiliser un Singleton.

public class MyApplication extends Application { 

private static MyApplication instance; 

public static MyApplication getInstance() { 
    if(instance == null){ 
     instance = new MyApplication(); 
    } 
    return instance; 
} 
} 
Questions connexes