Как мне получить доступ к глобальным переменным из события PhoneListener?

Я разрабатываю приложение для Blackberry на OS 5. Я пытаюсь получить доступ к некоторым ранее инициализированным переменным после успешного выполнения вызова. Однако переменные не сохраняют своих значений, и я не могу понять, почему.

Когда приложение запускается, 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;
        }
    }

person A. Felix    schedule 29.03.2011    source источник


Ответы (2)


Обратные вызовы 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;
    }
}
person siharkonnen    schedule 13.04.2011
comment
Спасибо! Именно этим я и закончил, но меня постоянно беспокоило то, что мне не хватало чего-то еще. Хорошо получить подтверждение. - person A. Felix; 18.04.2011

Это просто альтернативный способ сделать это. Сделайте GlobalClass синглтоном. Это гарантирует, что вы будете каждый раз получать один и тот же экземпляр класса.

Вот ссылка, которая показывает, как делать синглтоны.

Синглтон с аргументами в Java

Эта ссылка в Википедии даст подробное объяснение синглтонов. Надеюсь это поможет

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

person kensen john    schedule 30.03.2011
comment
Он по-прежнему не сохраняет ценности. Тем не менее, хороший подход, можно использовать его для других проектов. - person A. Felix; 30.03.2011
comment
Синглтоны не будут работать, так как они находятся в разных процессах. Архитектура Blackberry в корне неправильная ... :( - person lithium; 02.09.2011