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


У меня есть ошибка в коде, которая заставила меня думать, что я не полностью понимаю жизненный цикл Android. Да, я прочитал все документы и посмотрел на диаграммы, но они, кажется, говорят только о том, когда сохранить данные, когда деятельность может потерять фокус или погибнуть. Однако мой вопрос заключается в том, что если мне не нужно сохранять состояние, что происходит с переменными и их сохраненными значениями? Я ожидал, что они будут уничтожены, но ошибка в моем коде, кажется, указывает на обратное.

В моем случае вот что произошло. У меня есть действие, которое запускает пользовательское представление (без xml, я просто рисую растровые изображения на экране в своем пользовательском представлении). Единственная переменная, которая у меня в данный момент есть в моей деятельности, - это просто переменная для моего представления: GameView gameView;

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

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

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

Спасибо за любое понимание этого.

1 9

1 ответ:

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

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

Пожалуйста, смотрите понимание экземпляра и членов класса для больше информации. Отрывок:

Иногда вы хотите иметь переменные которые являются общими для всех объектов. Этот осуществляется с помощью статического модификатор. Поля, которые имеют статическое модификатором в их объявлении являются называемые статическими полями или классами переменная. Они связаны с классом, а не с каким-либо объект. Каждый экземпляр класса разделяет переменную класса, которая находится в одно фиксированное место в памяти. Какой-нибудь объект может изменять значение класса переменная, но переменные класса также могут быть манипулированным без создания экземпляр класса.