Android - это onDestroy, призванный уничтожить активность, ее переменные и освободить память - PullRequest
9 голосов
/ 16 декабря 2010

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

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

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

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

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

Спасибо за понимание этого вопроса.

1 Ответ

9 голосов
/ 16 декабря 2010

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

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

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

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

...