Что такое паттерн Observer
Что проверяют
Понимаете ли вы идею подписки на изменения и, главное, чем она опасна в Android: подписка живёт дольше экрана и держит его в памяти.
Как отвечать
Наблюдатель это поведенческий паттерн: у объекта-источника есть список подписчиков, и при изменении состояния он сам их уведомляет. Связь односторонняя, источник ничего не знает о подписчиках, кроме интерфейса.
В Android этот паттерн встроен почти везде:
- LiveData: подписка привязана к жизненному циклу, уведомления приходят только в активном состоянии, при уничтожении подписка снимается сама;
- Flow и StateFlow из корутин: сейчас основной способ, сбор запускается в
lifecycleScopeчерезrepeatOnLifecycle, чтобы не собирать данные в фоне; - RxJava:
Observableи подписка, которую обязательно складывают вCompositeDisposableи очищают; - обычные слушатели:
OnClickListener, колбэки адаптеров,BroadcastReceiver.
Простая реализация выглядит так:
class Subject {
private val observers = mutableListOf<(String) -> Unit>()
fun subscribe(o: (String) -> Unit) { observers += o }
fun unsubscribe(o: (String) -> Unit) { observers -= o }
fun publish(event: String) { observers.forEach { it(event) } }
}Плюсы: слабая связанность, несколько независимых потребителей одного события, удобное тестирование. Минусы, которые стоит назвать самому: неявный поток управления (по коду трудно понять, кто отреагирует), риск утечки при забытой отписке, каскад уведомлений при вложенных подписках.
Где спотыкаются
Не отписываются и держат ссылку на активность после её уничтожения.
Подписываются в onResume, а отписываются в onDestroy, и после нескольких переходов появляется несколько подписок сразу.
Путают горячие и холодные потоки: Flow начинает работу на каждого подписчика, StateFlow и SharedFlow общие для всех.