EventScope
Контейнер управления жизненным циклом подписок на события.
Обзор
EventScope — контейнер с интерфейсом AutoCloseable, отслеживающий подписки на события на протяжении жизненного цикла компонента. В интерфейсах забытая отписка при смене экрана или закрытии диалога — частая причина утечек памяти и фантомных обновлений.
Привязка подписок к EventScope позволяет отписать всех слушателей единым вызовом.
Управление жизненным циклом
listen(event, listener): Подписывает слушателя на событие и сохраняет подписку в скоупе.clear(): Отписывает всех текущих слушателей в обратном порядке, оставляя скоуп открытым для новых подписок.close(): Безвозвратно закрывает скоуп и отписывает всех слушателей. Последующие вызовыlisten()возвращаютEventSubscription.NOOP.EventScope.noop(): Фабрика создания неактивного скоупа, игнорирующего подписки, удобного при опциональной передаче скоупа.
Интеграция с жизненным циклом экрана
public class InventoryScreen extends UniScreen {
private final EventScope scope = new EventScope();
@Override
public void onOpen() {
scope.listen(ITEM_EQUIPPED, item -> updateSlot(item));
scope.listen(CURRENCY_CHANGED, balance -> updateBalance(balance));
}
@Override
public void onClose() {
scope.close(); // все слушатели отписываются автоматически
}
}
Связанные ссылки
API
EventScope::noop()
Пустой scope
Возвращает неактивный scope, игнорирующий все вызовы listen.
Возвращает EventScope: экземпляр неактивного EventScope.
EventScope::listen(EventPtr, EventListener)
Отслеживаемая подписка
Регистрирует слушателя и сохраняет подписку для последующей очистки.
| Параметр | Тип | Описание |
|---|---|---|
event |
EventPtr |
Указатель на событие |
listener |
EventListener |
Слушатель события |
Возвращает EventSubscription: Дескриптор EventSubscription.
EventScope::clear()
Очистить подписки
Отписывает всех зарегистрированных слушателей без закрытия scope.
EventScope::close()
Закрыть scope
Закрывает scope и отписывает всех слушателей.