2011-03-29 4 views
0

Je suis en train de développer une application pour Blackberry sur OS 5. J'essaie d'avoir accès à certaines variables précédemment initialisées quand un appel est réussi. Cependant, les variables ne tiennent pas leur valeur et je ne peux pas trouver pourquoi. Lorsque l'application est lancée, testVariable est défini sur 5, tout fonctionne comme prévu.Comment accéder aux variables globales à partir d'un événement PhoneListener?

Cependant, lorsque j'essaie d'accéder à la variable de l'événement callConnected, il revient à 0. Même si je place la variable dans la classe PhoneEvents, elle revient à 0. Elle a une valeur pour PhoneEvents et une autre pour l'écran. Ces variables ne devraient-elles pas avoir une seule valeur étant donné que ce n'est pas une variable d'instance? Qu'est-ce que je fais mal? Existe-t-il un autre moyen d'avoir une variable accessible à partir de la classe PhoneEvents et de la classe TestScreen et de garder sa valeur? Merci d'avance.

public class TestApp extends UiApplication { 
     public TestApp() { 
      TestScreen screen = new TestScreen(); 
      UiApplication.getUiApplication().pushScreen(screen); 
     } 

     public static void main(String[] args) { 
      Phone.addPhoneListener(new PhoneEvents()); 
      TestApp app = new TestApp(); 
      app.enterEventDispatcher(); 
     } 
    } 

    // The main screen. 
    public class TestScreen extends MainScreen { 
     public TestScreen() { 
      this.setTitle("Test"); 
      GlobalClass.testVariable = 5; 
     } 
    } 

    // A public static holding a variable I want to have access to. 
    public class GlobalClass { 
     public static int testVariable; 
    } 

    // The method that gets called when a call is made. 
    public class PhoneEvents implements PhoneListener { 
     public void callConnected(int callId) { 
      int x = GlobalClass.testVariable; 
     } 
    } 

Répondre

0

callbacks PhoneListener exécuter dans un processus différent. Vous le remarquez par exemple en appelant UiEngine.getUiEngine(). GetActiveScreen(), qui renvoie l'écran du téléphone lorsque vous l'appelez depuis les rappels PhoneListener et l'écran de l'application lorsque vous l'appelez avant d'enregistrer PhoneListener. Les variables statiques sont également différentes.

Une solution est de mettre vos données d'application au RuntimeStore:

class ApplicationData 
{ 
    public int testVariable; 
} 

ApplicationData appData = new ApplicationData(); 
appData.testVariable = 5; 

RuntimeStore.getRuntimeStore().put(MY_DATA_ID, appData); 

public class PhoneEvents implements PhoneListener { 
    public void callConnected(int callId) { 
     ApplicationData appData = (ApplicationData) RuntimeStore.getRuntimeStore().get(MY_DATA_ID); 
     int x = appData.testVariable; 
    } 
} 
+0

Merci, c'est exactement ce que j'ai fini par faire, mais ça ne cessait de m'énerver pour savoir s'il y avait autre chose qui me manquait. –

0

Ceci est juste un autre moyen de le faire. Faire de la GlobalClass un Singleton. Cela garantira que vous obtiendrez la même instance de la classe à chaque fois.

Voici un lien qui montre comment créer des singletons.

Singleton with Arguments in Java

Ce lien Wikipédia donnera une explication détaillée sur les singletons. Espérons que cela aide

http://en.wikipedia.org/wiki/Singleton_pattern

+0

Il ne tient pas encore la valeur. Une bonne approche cependant, pourrait être l'utiliser pour d'autres projets. –

+0

Singletons ne fonctionnera pas, car ils sont sur des processus différents. L'architecture de Blackberry est fondamentalement fausse ... :( – lithium

Questions connexes