Выбор ответа 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: утечка. Синглтон живёт столько же, сколько процесс.
Варианты ответа
- Ничем:
Contextможно хранить где угодно, система сама освобождает его lateinitнельзя использовать сContext, будет ошибка при первом обращенииobjectнельзя инициализировать из Activity, это вызовет гонку при поворотеobjectживёт весь процесс и удержит первую Activity со всеми view: утечкаправильный ответ
Разбор
Синглтон живёт столько же, сколько процесс. После поворота или закрытия Activity сборщик мусора не сможет её освободить, потому что на неё ссылается Analytics. В долгоживущие объекты передают applicationContext. Hilt защищает от этой ошибки на этапе сборки: @ActivityContext недоступен в SingletonComponent, а в синглтоны внедряют @ApplicationContext. lateinit с Context работает, инициализировать object из Activity технически можно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.