2013-07-27 2 views
17

, когда я объявляю и инициализирую переменную как статическую в своей основной деятельности, и действие уничтожается. Могу ли я получить доступ к содержимому переменной?Срок службы статической переменной в Android

Например, чтобы всегда получать доступ к AsyncTask, который я хранил для этой переменной? Я хочу, чтобы иметь возможность получить к нему доступ также после изменения ориентации.

+0

У меня были огромные проблемы из-за статических переменных. Очистка памяти непредсказуема и может привести к неожиданному сбою. Вы можете принудительно очистить память, очистив RAM (удерживайте кнопку «Домой», чтобы попасть туда). Если ваше приложение все еще работает, вы должны быть в безопасности ;-) –

ответ

11

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

В Android вы видели, что когда мы закрываем любое приложение, оно полностью не закрывается, оно остается в последнем стеке приложений. Это вы можете видеть, удерживая кнопку home (On Most Devices).

сам Android выгонят те недавние приложения, когда другие приложения требуется память

+0

доказательство, ссылка? Почему этот класс и его загрузчик классов не могут быть выгружены из памяти, а приложение продолжает работать? – kreker

2

Если процесс был убит, все статические переменные будут повторно инициализированы до их значений по умолчанию.

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

+0

Это означает, что, если режим запуска активности - singleInstance, например, он будет там, пока устройство не будет перезагружено, не так ли? –

+0

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

4

Могу ли я получить доступ к содержимому переменной?

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

Участники статических данных живут в течение всего процесса.

Например, чтобы всегда получать доступ к AsyncTask, который я хранил для этой переменной? Я хочу, чтобы иметь возможность доступа к нему также после изменения ориентации.

Это не подходящее решение. Используйте оставшийся фрагмент, или use onRetainNonConfigurationInstance().

+0

'' 'onRetainNonConfigurationInstance()' '' является окончательным в рамках поддержки, поэтому это не работает. – maysi

+1

@Simon: Затем используйте сохраненный фрагмент (т. Е. Фрагмент, на который вы назвали 'setRetainInstance (true)', который управляет 'AsyncTask'). См. Https://github.com/commonsguy/cw-omnibus/tree/master/Threads/AsyncTask – CommonsWare

+0

hm Я до сих пор не понимаю, как это сделать. У меня есть главный способ, который является «« Шерлок-ФрагментАктивность »и имеет метод обновления. В этом методе создается и выполняется новый объект моей '' 'AsyncTask'''. Когда запускается Task ('' 'onPreExecute()' ''), создается '' 'Dialog'', и сообщение о диалоге 3 раза изменяется в моей' '' doInBackground() '' 'и в' '' onPostExecute() '' 'диалог отклоняется. Но когда меняется ориентация, возникают некоторые проблемы. например диалога больше нет. так как я должен продолжать? должен ли я сделать новое обсуждение, где я объясню это подробно? – maysi

0

Android имеет концепцию empty process, который говорит ваше приложение не может быть удален из памяти, если она часто используется пользователь, даже если уничтожены все его компоненты (действия, службы и/или широковещательные приемники), и в этом случае статические переменные не будут полностью очищены.

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

Ссылка: http://skillgun.com/question/9849/android-provab/face-to-face-round/if-i-close-the-application-will-it-destroy-all-the-static-variables

0

Статические переменные или статические блоки не связаны с объектом. Это переменная уровня класса, не связанная с объектом. Если мы уничтожим объект, статическая переменная не будет уничтожать, которая определена в том же классе.Статическая переменная инициализируется один раз в памяти.

поэтому, когда мы закрываем объекты приложения, уничтожаем, но статическую переменную не уничтожаем. Но когда мы очищаем приложение, тогда класс уничтожает и, следовательно, статическую переменную. Когда-то истребитель андроида убивает класс из-за свободного пространства памяти, в этом случае статическая переменная уничтожает.

+0

Вы не имеете в виду? > Статические переменные или статические блоки НЕ связаны с объектом. – ajmccall

+0

НЕТ, я имею в виду, что статические переменные или статические блоки НЕ связаны с объектом. –

+0

Хорошо, рад, что мы очистили это: / – ajmccall

Смежные вопросы