Выбор ответа Middle Производительность и утечки памяти обновлено
Утечка через postDelayed
Вопрос
Activity вызывает handler.postDelayed({ textView.text = "готово" }, 60_000) и через секунду закрывается. Что происходит?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Лямбда держит Activity через textView ещё минуту, потом обновит мёртвую view. Отложенное сообщение лежит в MessageQueue главного потока, а оно ссылается на лямбду, которая захватила textView и через неё Activity.
Варианты ответа
- Задача отменится автоматически в
onDestroy:Handlerпривязан к жизненному циклу - Приложение упадёт сразу при закрытии из-за отложенного сообщения в очереди
- Сообщение выполнится немедленно при закрытии, раз очередь сбрасывается
- Лямбда держит Activity через
textViewещё минуту, потом обновит мёртвую viewправильный ответ
Разбор
Отложенное сообщение лежит в MessageQueue главного потока, а оно ссылается на лямбду, которая захватила textView и через неё Activity. До выполнения Activity недоступна для GC. Нужно handler.removeCallbacksAndMessages(null) в onDestroy или, лучше, корутина в lifecycleScope, которая отменится сама. Автоматической отмены у Handler нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.