Ответ
- Анонимные классы и внутренние классы – удерживают ссылку на внешний класс (Activity/Fragment).
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) { /*...*/ }
})
**Решение:** Используйте лямбды или слабые ссылки (`WeakReference`).
- Статические ссылки на контекст/View – живут дольше активити.
companion object {
var context: Context? = null // Утечка!
}
**Решение:** Используйте `ApplicationContext` или `WeakReference`.
- Неотменённые Rx-подписки, корутины – продолжают работать после уничтожения активити.
lifecycleScope.launch { /* Долгая операция */ } // Утечка без `repeatOnLifecycle`.
**Решение:** Отменяйте через `Disposable.clear()` или `lifecycleScope`.
-
Синглтоны с контекстом – например,
Retrofitс передачейActivity.
Решение: ПередавайтеApplicationContext. -
Регистрация BroadcastReceiver без отмены – удерживает активити в памяти.
override fun onStart() {
registerReceiver(receiver, filter) // Утечка, если не unregisterReceiver.
}
Инструменты для поиска: Android Profiler, LeakCanary.