статические переменные сохраняют значения от предыдущего запуска - PullRequest
1 голос
/ 10 марта 2011

Мои приложения j2me вызывают destroyApp() и notifyDestroyed(), когда хотят закрыть когда я запускаю его на blackberry, при втором запуске статические переменные будут иметь те же значения, что и при предыдущем запуске.

Почему они не получают начальное значение? Как я могу убедиться, что приложение инициализирует статические переменные?

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Это обсуждение на форумах поддержки Blackberry предполагает, что это известная проблема с мидлетами BlackBerry - по крайней мере, с теми, которые используют статические push-реестры.Предлагаемые обходные пути: либо переопределить статические переменные в startApp, либо избавиться от статического толчка.

Этот пост выглядит заслуживающим подробного цитирования, поскольку есть хороший пример кода и анализ проблемы:

Самый простой пример, который я мог бы привести, это:

public class BasicMIDlet extends MIDlet {

    private static byte myByte = Byte.MIN_VALUE;

    public void startApp() {
        System.out.println("My byte: " + myByte);
        myByte = Byte.MAX_VALUE;
        notifyDestroyed();
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }


}

Можно ожидать, что myByte будет выводить значение -128 при каждом запуске приложения, но это мой вывод:

--------------------------------------------------------

Starting BBTest
Started BBTest(159)
Foreground BBTest(157)
My byte: -128                          <------------
Foreground net_rim_bb_ribbon_app(83)
Exit BBTest(159)
Starting BBTest
Started BBTest(160)
Foreground BBTest(157)
My byte: 127                          <------------
Foreground net_rim_bb_ribbon_app(83)
Exit BBTest(160)
Starting BBTest
Started BBTest(161)
Foreground BBTest(157)
My byte: 127                          <------------
Foreground net_rim_bb_ribbon_app(83)
Exit BBTest(161)
--------------------------------------------------------

Я кое-что заметил, если я удаляю статические push-реестры, приложение работает нормально и каждый раз выдает -128.Да, у меня такое же чувство, что мидлет работает поверх RIMlet, и в случае, если мидлет определяет push-реестры, RIMlet работает все время.Поэтому мой вопрос сейчас заключается в том, существуют ли какие-либо решения, кроме инициализации статических переменных при каждом запуске (поскольку в моем приложении примерно 1000 таких членов)

1 голос
/ 16 ноября 2011

Да, мидлеты ежевики сохраняют значения статических переменных.Это проблема, и единственный способ ее исправить - это то, что при запуске нам нужно присвоить нулевые значения статическим значениям.Например, если статическая переменная объявлена ​​как: public static String State = null;А в жизненном цикле середины значение устанавливается на «закрыто»;Затем при следующем запуске приложения значение остается «закрытым» вместо нулевого.

0 голосов
/ 10 марта 2011

Полагаю, вы имеете в виду, что "во втором запуске статические переменные будут не иметь те же значения, что и в предыдущем запуске".

Статические переменные могут толькосохранить свою ценность в течение всего срока службы приложения.Приложение завершается, когда вызывается destroyApp() / notifyDestroyed(), поэтому значения теряются!

Чтобы сохранить состояние на нескольких запусках, используйте RecordStore.

...