Сборщик мусора в Android Activity

1

Я заметил это поведение при разработке простой игры Android, которая имеет 2 действия.

В игре есть 2 действия, первый - экран, который позволяет пользователю выбирать тип противника, уровень и т.д., а второй - фактический игровой экран. Второе действие создает объект класса GameManager, который обрабатывает всю обработку игры. Этот класс GameManager также создает CountDownTimer, который начинает запрашивать ввод пользователя (по истечении времени игры против игрока).

Я заметил, что если пользователь выходит из второго действия (возвращается к первому), а затем снова запускает новую игру, предыдущий таймер все еще работает до завершения. Я обработал это, явно отменив таймер (из onDestroy() второго действия), поскольку просто установка timerobject на "null" не отменяет таймер.

Однако мне любопытно, почему предыдущий таймер работал даже после того, как моя активность была отключена в первый раз? Разве GC не удалил все объекты, созданные вторым действием (и любыми дочерними объектами, которые он создал), когда он был удален? Было бы здорово узнать причину наблюдаемого поведения?

ТИА

Теги:
garbage-collection

2 ответа

4
Лучший ответ

Если GC не удалил все объекты, созданные вторым действием (и любыми дочерними объектами, которые он создал), когда он был удален?

Это не то, как работает сбор мусора. GC не несет ответственности за "удаление объектов" - он отвечает за сбор "потерянных" объектов и освобождение их ресурсов. Даже тогда GC не гарантированно своевременно добраться до всех сирот.

Кроме того, любые объекты, которые могут быть "системными" объектами и должны быть выпущены явно, никогда не могут быть выпущены, если ваш код этого не делает. Другие проблемы с GC могут включать создание объектов, которые другие потоки (кроме Activity, которые их создали) могут иметь ссылку.

Вы указываете свой "таймер", но не объясняете, какой класс вы используете для него. Я предлагаю специально прочитать об этом классе и посмотреть, что подразумевается для ceation/deletion (возможно, явный "выпуск" ресурсов).

GC - очень серая область на любой платформе. С Android это обычно довольно быстро, но с характером жизненного цикла Activity очень сложно предсказать, что произойдет.

В общем, используйте onCreate, onPause и onResume в действиях, а также такие вещи, как savedInstanceState и SharedPreferences, чтобы отслеживать, что происходит.

  • 0
    Как упоминалось в моем первом посте, я использовал CountDownTimer (из android.os.CountDownTimer). Думаю, это не всем известно :) - developer.android.com/reference/android/os/CountDownTimer.html не так уж много о создании / удалении этого. Хм .. так что я думаю, что установка его на ноль не поможет тогда?
  • 0
    @ source.rar: Извиняюсь, оглядываясь назад, я вижу это сейчас. Поскольку это абстрактный класс и часть android.os, то установка любой ссылки на него на «ноль» не будет работать так же, как с обычными классами. Как вы обнаружили, вам нужно явно вызвать его метод cancel () - это было моей целью понять специфику класса (например, абстрактность и т. Д.) И относиться к нему соответствующим образом. Иногда необходимо вызывать такие методы, как «отмена» или «выпуск» и т. Д. С классами на системном уровне. Однако с такими классами GC для вашего собственного приложения не подходит.
Показать ещё 2 комментария
0

CountDownTimer не связан с активностью, как вы уже узнали. В этих случаях намек на то, что класс не получает Context в своем конструкторе. Следовательно, это не может быть связано с деятельностью.

  • 0
    Звучит не очень хорошо. Тогда любой пользовательский объект, который не принимает контекст, не будет привязан к активности и не будет GCed.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню