Я заметил это поведение при разработке простой игры Android, которая имеет 2 действия.
В игре есть 2 действия, первый - экран, который позволяет пользователю выбирать тип противника, уровень и т.д., а второй - фактический игровой экран. Второе действие создает объект класса GameManager, который обрабатывает всю обработку игры. Этот класс GameManager также создает CountDownTimer, который начинает запрашивать ввод пользователя (по истечении времени игры против игрока).
Я заметил, что если пользователь выходит из второго действия (возвращается к первому), а затем снова запускает новую игру, предыдущий таймер все еще работает до завершения. Я обработал это, явно отменив таймер (из onDestroy() второго действия), поскольку просто установка timerobject на "null" не отменяет таймер.
Однако мне любопытно, почему предыдущий таймер работал даже после того, как моя активность была отключена в первый раз? Разве GC не удалил все объекты, созданные вторым действием (и любыми дочерними объектами, которые он создал), когда он был удален? Было бы здорово узнать причину наблюдаемого поведения?
ТИА
Если GC не удалил все объекты, созданные вторым действием (и любыми дочерними объектами, которые он создал), когда он был удален?
Это не то, как работает сбор мусора. GC не несет ответственности за "удаление объектов" - он отвечает за сбор "потерянных" объектов и освобождение их ресурсов. Даже тогда GC не гарантированно своевременно добраться до всех сирот.
Кроме того, любые объекты, которые могут быть "системными" объектами и должны быть выпущены явно, никогда не могут быть выпущены, если ваш код этого не делает. Другие проблемы с GC могут включать создание объектов, которые другие потоки (кроме Activity, которые их создали) могут иметь ссылку.
Вы указываете свой "таймер", но не объясняете, какой класс вы используете для него. Я предлагаю специально прочитать об этом классе и посмотреть, что подразумевается для ceation/deletion (возможно, явный "выпуск" ресурсов).
GC - очень серая область на любой платформе. С Android это обычно довольно быстро, но с характером жизненного цикла Activity очень сложно предсказать, что произойдет.
В общем, используйте onCreate, onPause и onResume в действиях, а также такие вещи, как savedInstanceState и SharedPreferences, чтобы отслеживать, что происходит.
CountDownTimer
не связан с активностью, как вы уже узнали. В этих случаях намек на то, что класс не получает Context
в своем конструкторе. Следовательно, это не может быть связано с деятельностью.