Как получить доступ к глобальным переменным из события PhoneListener? - PullRequest
0 голосов
/ 30 марта 2011

Я разрабатываю приложение для 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;
        }
    }

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Обратные вызовы 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;
    }
}
0 голосов
/ 30 марта 2011

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

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

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

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

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

...