Время жизни статической переменной в Android

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

  • Утечки контекста (например, активность). Статическая переменная сохраняет ссылку на контекст или объект (например, представление), который сохраняет ссылку на него.
  • Огромная нагрузка на память: если вы используете статические переменные в типах, жизненный цикл которых меньше, чем у приложения, процесс поддерживает все статические переменные в рабочем состоянии. Например, в десяти действиях вы сохраняете растровое изображение в качестве статической переменной. В этом случае все растровые изображения являются живыми и занимают место в памяти. В конце память и система не могут смириться с бременем и выдают исключение MemoryOutBoundException.
  • Сбои: например, в сценарии вы создаете объект в действии, а затем сохраняете его в действии как статическую переменную. После этого вы переходите к следующему занятию. Во втором упражнении вы уверены, что статическая переменная предыдущего действия не равна нулю, и в большинстве случаев это правда. Однако если система убивает процесс и воссоздает его, статическая переменная не сохраняет свой объект. Я хочу сказать, что в среде, управляемой событиями, управление статическими переменными - задача не из легких.

Для вашего случая: Компонент архитектуры ViewModel сохраняет объекты при изменениях конфигурации. Вы можете использовать его, однако вам все равно нужно быть осторожным с утечками контекста. Другой вариант - использовать фрагмент без пользовательского интерфейса. Вы вызываете функцию setRetainInstance(true) во фрагменте, и система сохраняет этот фрагмент при изменениях конфигурации. Этот фрагмент хранит ваши данные, и вы можете получить этот фрагмент через менеджер фрагментов после изменения конфигурации. На самом деле последний вариант является основным механизмом ViewModel. Для многопоточных случаев, таких как AsyncTask, операция, выполняемая в отдельном потоке, не должна сохранять ссылку на контекст. Вы должны запустить задачу в отдельном слое, а затем обновить необходимые поля в viewModel или сохраненном фрагменте.

Ответ 5

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

Классы редко собирают мусор, поскольку они живут в так называемом Permanent Generation пространстве памяти (вы можете узнать больше о том, как работает GC поколений здесь https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html).

Вы можете взглянуть на https://developer.android.com/topic/performance/memory-overview, чтобы лучше понять, как управлять памятью в Android, но если ваше приложение не делает что-то очень необычное, постоянное поколение выделяет всю память, которая ему нужна для хранения всех его классов, и не будет мусор собрал.

Изменения ориентации не очистят статическую переменную, однако, если ваша цель использовать статическую переменную не очень подходит. Вы можете сохранить состояние экземпляра при изменении ориентации, используя setRetainInstance или подобное (см. Android: как предотвратить очистку переменных класса при изменении ориентации для ответа)

Ответ 6

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

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

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

Ответ 7

Они останутся, даже если вы закроете приложение нажатием кнопки "Назад", пока вы не очистите их от недавних приложений. Доказательство: хорошо, я проверил это, вы тоже можете легко;).

Ответ 8

Я полагаю, что наконец-то нашла вам ссылку -

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

https://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html

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

Ответ 9

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

Если вы все еще хотите получить доступ к этой переменной, у вас есть 2 варианта: -

  1. переопределите onSaveInstanceState и сохраните необходимые переменные и восстановите их в onRestoreInstanceState
  2. Храните переменные в классе Application и обращайтесь к ним где угодно в любой момент.

Ответ 10

Значение статических переменных будет сохраняться до тех пор, пока класс загружен - он почти не имеет отношения к жизненному циклу Activity (onCreate,..., onDestroy)

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

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

Поэтому, если вы создадите приложение для Android и инициализируете статическую переменную, оно останется в JVM, пока не произойдет одно из следующих действий: 1. класс выгружается 2. JVM закрывается 3. процесс умирает

Ответ 11

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

Ответ 12

Я на самом деле удивлен, что никто не смог найти ссылку. Это прямо там, в Википедии:

...a static variable is a variable that has been allocated "statically", meaning that its lifetime (or "extent") is the entire run of the program. This is in contrast to shorter-lived automatic variables, whose storage is stack allocated и deallocated on the call stack; и in contrast to objects, whose storage is dynamically allocated и deallocated in heap memory.

Это определение для общих языков программирования. Но его можно использовать как ссылку на Android. Однако в объектно-ориентированных языках программирования:

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

Это означает, что в Android, где используется Java, статические переменные имеют время жизни, равное времени жизни приложения или экземпляра, который его использует, если эта статическая переменная не создана во время выполнения.

Ответ 13

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

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

Ответ 14

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

проблемы

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

  2. Если ваше представление привязано к статическим переменным, таким как ArrayList, к представлению рециркулятора, оно будет выдавать ошибки, такие как исключения нулевого указателя, для которых вы должны проверять баланс каждый раз при инициализации представления.

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