Когда вы разделяете проект на логические части (например, с помощью MVP), иногда необходимо взаимодействовать между различными частями. Как правило, эта связь осуществляется путем отправки изменений статуса, например ::10000
- пользователь вошел в систему / вышел из системы.
- пользователь перешел непосредственно через URL на страницу, поэтому необходимо обновить меню.
Использование шины событий в этих случаях вполне логично.
Чтобы использовать его, вы создаете один экземпляр EventBus
для приложения, который затем используется всеми другими классами. Для достижения этого используйте статическое поле, фабричную или зависимую инъекцию (GIN в случае GWT).
Пример с вашими собственными типами событий:
public class AppUtils{
public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
}
Обычно вы также создаете свои собственные типы событий и обработчики:
public class AuthenticationEvent extends GwtEvent<AuthenticationEventHandler> {
public static Type<AuthenticationEventHandler> TYPE = new Type<AuthenticationEventHandler>();
@Override
public Type<AuthenticationEventHandler> getAssociatedType() {
return TYPE;
}
@Override
protected void dispatch(AuthenticationEventHandler handler) {
handler.onAuthenticationChanged(this);
}
}
и обработчик:
public interface AuthenticationEventHandler extends EventHandler {
void onAuthenticationChanged(AuthenticationEvent authenticationEvent);
}
Тогда вы используете это так:
AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler() {
@Override
public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
// authentication changed - do something
}
});
и запустить событие:
AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());