Выбор ответа Middle Производительность и утечки памяти обновлено

Утечка через postDelayed

Вопрос

Activity вызывает handler.postDelayed({ textView.text = "готово" }, 60_000) и через секунду закрывается. Что происходит?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Лямбда держит Activity через textView ещё минуту, потом обновит мёртвую view. Отложенное сообщение лежит в MessageQueue главного потока, а оно ссылается на лямбду, которая захватила textView и через неё Activity.

Варианты ответа

  1. Задача отменится автоматически в onDestroy: Handler привязан к жизненному циклу
  2. Приложение упадёт сразу при закрытии из-за отложенного сообщения в очереди
  3. Сообщение выполнится немедленно при закрытии, раз очередь сбрасывается
  4. Лямбда держит Activity через textView ещё минуту, потом обновит мёртвую viewправильный ответ

Разбор

Отложенное сообщение лежит в MessageQueue главного потока, а оно ссылается на лямбду, которая захватила textView и через неё Activity. До выполнения Activity недоступна для GC. Нужно handler.removeCallbacksAndMessages(null) в onDestroy или, лучше, корутина в lifecycleScope, которая отменится сама. Автоматической отмены у Handler нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.