Выбор ответа Middle DI: Hilt и Koin обновлено

Activity-контекст в синглтоне

Вопрос

Чем опасен этот код?

object Analytics {
    private lateinit var context: Context
    fun init(context: Context) { this.context = context }
}

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Analytics.init(this)
    }
}

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

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

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

Коротко

Правильный ответ: object живёт весь процесс и удержит первую Activity со всеми view: утечка. Синглтон живёт столько же, сколько процесс.

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

  1. Ничем: Context можно хранить где угодно, система сама освобождает его
  2. lateinit нельзя использовать с Context, будет ошибка при первом обращении
  3. object нельзя инициализировать из Activity, это вызовет гонку при повороте
  4. object живёт весь процесс и удержит первую Activity со всеми view: утечкаправильный ответ

Разбор

Синглтон живёт столько же, сколько процесс. После поворота или закрытия Activity сборщик мусора не сможет её освободить, потому что на неё ссылается Analytics. В долгоживущие объекты передают applicationContext. Hilt защищает от этой ошибки на этапе сборки: @ActivityContext недоступен в SingletonComponent, а в синглтоны внедряют @ApplicationContext. lateinit с Context работает, инициализировать object из Activity технически можно.

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

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