Почему startApp () используется вместо конструктора в приложениях Java ME? - PullRequest
3 голосов
/ 02 марта 2010

Во многих руководствах по Java ME для создания и инициализации объектов используется метод startApp (), а конструктор остается пустым. Однако метод startApp () также вызывается, когда мидлет возобновляет работу из состояния паузы. Это приводит к повторной инициализации всех объектов, а любые сделанные изменения теряются.

Я также заметил, что IDE netbeans в своем автоматически сгенерированном коде использует множество if (object == null) операторов в startApp () для проверки, был ли объект создан ранее. *

Не имеет ли смысла просто выполнять все создание и инициализацию объекта в самом конструкторе? Есть ли причина этого не делать?

1 Ответ

3 голосов
/ 03 марта 2010

Это частично относится к пониманию модели потоков MIDP.

Какой поток вызывается конструктором мидлета, зависит от того, кто разработал виртуальную машину Java на телефоне.

Разработчики склонны полагаться только на то, что спецификация MIDP говорит в этой области, и именно так должны вести себя обработки событий startApp, pauseApp и lcdui.

Однако есть только несколько случаев, когда это важно.

Второй аспект этой проблемы - разработчики программного обеспечения, пытающиеся освободить как можно больше ресурсов (памяти, файловых дескрипторов, сокетов ...), когда мидлет приостановлен.

Опять же, бывают случаи, когда мидлеты должны зависать на некоторых ресурсах, даже когда они приостановлены, но вам действительно нужно думать о том, что вы делаете (и понимать это лучше, чем случайно) при кодировании такого рода поведения.

Стоит также помнить, что некоторые телефоны всегда поддерживают процесс JVM. Если у них также есть JVM, которая не поддерживает выгрузку классов (как обычно в мире J2ME), это означает, что статические переменные могут оставаться в памяти даже после полного уничтожения мидлета.

...