Статическая переменная область Android и время жизни - PullRequest
4 голосов
/ 15 марта 2011

У меня есть приложение, в котором есть служба, которая использует ArrayList<Double> для хранения чисел в фоновом режиме в течение очень долгого времени;переменная инициализируется при запуске службы.

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

Переменная, вероятно, будет ~ 1MB-> 2MB в течение срока ее службы.

Можно ли с уверенностью сказать, что эта переменная никогда не будет обнуляться GC или системой, или есть какой-нибудь способ предотвратить это?

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

У меня есть приложение, в котором есть служба, которая использует ArrayList для хранения чисел в фоновом режиме в течение очень долгого времени

Если «очень долгое время» больше, чем «несколько секунд, или если пользователь явно запрашивает его запуск», то у нас проблемы.

Проще говоря, ваш сервис не будет жить "очень долго". Пользователь прекратит работу с помощью программы-убийцы, или пользователь прекратит работу с помощью приложения «Настройки», или Android прекратит работу из-за чрезмерного возраста. Слишком много разработчиков теряют сервисы, вызывая снижение производительности устройства.

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

Можно ли с уверенностью сказать, что эта переменная никогда не будет обнуляться GC или системой, или есть ли способ предотвратить это?

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

1 голос
/ 15 марта 2011

Можно ли с уверенностью сказать, что переменная никогда не будет обнуляться GC или системой

Да, если переменная доступна в вашемкод, но это может быть хорошо или плохо.

"Время жизни" статической переменной - это время класса - "всегда и навсегда", пока этот класс загружен - и область видимостилюбой код, который может получить доступ к указанному стабильному идентификатору, например, тот, который разрешен через модификаторы видимости, хотя отражение также может быть рассмотрено.Таким образом, явно / вручную может установить для переменной значение «null» или «фиктивный объект», когда она не используется, - если нет других ссылок на объект, на которые ссылается переменная -- сделать указанный объект пригодным для восстановления.

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

Счастливого кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...