Зачем избегать System.exit ()? - PullRequest
6 голосов
/ 29 ноября 2011

Я читал в книге Энтони Ризка «Начало разработки BlackBerry», что, хотя метод System.exit() будет выходить из приложения, рекомендуется избегать этого и правильно очищать приложение при выходе, закрывая все экраны. У меня вопрос, зачем избегать System.exit()?

Ответы [ 4 ]

6 голосов
/ 30 ноября 2011

Это действительно интересный вопрос!

Существует различие в поведении System.exit() для Java SE API и BB Java API:

  • В Java SE API: завершаетв настоящее время работает виртуальная машина Java .
  • В BB Java API: завершает текущее Java-приложение .

Также проверьте, что сказанооб этом в «Изучении разработки игр Blackberry» Кэрол Хамер и Эндрю Дэвисона:

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

Итак, да, для каждого устройства BB есть единственная JVM.И да, в приложении BB вызов System.exit() просто останавливает ваше приложение, оставляя все ваши статические данные в оперативной памяти, если вы не выполните предварительную очистку .

Так что вам не следует избегать System.exit() - это законный / правильный способ закрыть приложение BB, , но просто выполните очистку перед этим вызовом .

ОБНОВЛЕНИЕ:

по электронной почте Ой.Я создал тестовое приложение (используя симулятор JDE 4.7.0 + Storm 9530 4.7.0), чтобы проверить, действительно ли статический материал остается в оперативной памяти после вызова System.exit().И оказывается, что он больше не остается там.В следующий раз, когда я войду в приложение, статические переменные будут нулевыми (как и следовало ожидать, они будут в Java SE).Поэтому мне неясно, что Кэрол Хамер и Эндрю Дэвисон имеют в виду, говоря «Остатки более раннего прогона (такие как статические переменные и другие данные, все еще находящиеся в памяти) могут потенциально повлиять на последующие запуски приложения» * 1039 *

2 голосов
/ 29 ноября 2011

Это потому, что он может закорачивать ваши собственные упорядоченные методы выхода, например, очистка буферизованных потоков вывода / записи, выход из сеансов, удаление файлов, фиксация транзакций СУБД, ...

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

Насколько я понимаю, некорректно уничтожать ваш контейнер, вызывая System.exit (). Правильный способ сделать это - создать метод destroy (), который позволяет очищать ваши потоки и закрывать все открытые вами ресурсы.

Если говорить о вещах непрофессионала, System.exit () может оставить устаревшие данные / информацию о сеансе.

0 голосов
/ 29 ноября 2011

Из того, что я помню о разработке BB, System.exit () просто закрывает приложение, не разрушая созданные вами объекты, оставляя их сборщику мусора. Следовательно, приложение не будет эффективно удалено из памяти. Закрытие экранов один за другим фактически освободит их.

Возможно, я не совсем в деталях, но в сети достаточно информации о лучших практиках:)

...