如何从PhoneListener事件访问全局变量?

时间:2011-03-29 22:53:47

标签: blackberry java-me

我正在OS 5上为Blackberry开发一个应用程序。我正在尝试在成功调用时访问一些先前初始化的变量。但是,变量并没有保持其价值,我找不到原因。

当应用程序启动时,testVariable设置为5,一切都按预期工作。但是,当我尝试从callConnected事件访问变量时,它返回到0.即使我将变量放在PhoneEvents类中,它仍然会返回0.它有一个值用于PhoneEvents而另一个用于屏幕。这些变量不应该只有一个值,因为它不是一个实例变量吗?我究竟做错了什么?有没有其他方法可以从PhoneEvents类和TestScreen类访问变量并让它保持其值?提前致谢。

    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;
        }
    }

2 个答案:

答案 0 :(得分:0)

这只是另一种方法。使GlobalClass成为单身人士。这将保证您每次都能获得同一个班级实例。

这是一个显示如何制作单身人士的链接。

Singleton with Arguments in Java

此维基百科链接将对单身人士进行深入解释。希望这有帮助

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

答案 1 :(得分:0)

PhoneListener回调在不同的进程中运行。你可以通过调用UiEngine.getUiEngine()。getActiveScreen()来注意这一点,当你在注册PhoneListener之前调用它时,它会从PhoneListener回调和应用程序屏幕调用它时返回电话屏幕。静态变量也是不同的。

一种解决方案是将您的应用程序数据放入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;
    }
}