Вызов метода по событию , регистрация на событие

204
01 августа 2017, 15:58

Как на java реализовать что бы по определённому событию вызывались определённые методы, которые подписаны на это событие. То есть если нажали button1 в наш метод (контроллер) передалось что произошло событие Events1 и в соответствие с этим событием вызываются методы , которые подписаны на это событие.

Answer 1

Вам вполне подойдет концепция EventBus (шины данных) https://github.com/greenrobot/EventBus.

Она нужна для того, чтобы независимые компоненты могли общаться между собой путем отправки и приема событий.

Вы можете посмотреть в сторону готовых библиотек, а можете попробовать реализовать шину сами, это не сложно.

Создайте аннотацию EventReceiver:

@Documented
@Retention(value= RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface EventReceiver
{
}

Создайте класс EventChannel:

public abstract class EventChannel
{
    private EventChannel(){}
    private static final Set<Object> receivers = new HashSet<>();
    private static final Handler handler = new Handler(Looper.myLooper());
    public static void connect(Object receiver) {
        receivers.add(receiver);
    }
    public static void disconnect(Object receiver) {
        receivers.remove(receiver);
    }
    public static void send(Object data) {
        for (Object receiver : receivers) {
            new Thread(() -> {
                for (Method method : receiver.getClass().getDeclaredMethods()) {
                    if (method.isAnnotationPresent(EventReceiver.class)) {
                        handler.post(() -> {
                            try { method.invoke(receiver, data);}
                            catch (Exception ignored) {}
                        });
                     }
                 }
            }).start();
        }
    }
}

Всё, что вам нужно чтобы отправить событие:

EventChannel.send(new CustomData());

Всё, что вам нужно, чтобы поймать событие - подключиться к шине данных в классе-приёмнике: EventChannel.connect(this); и определить метод с аннотацией EventReceiver:

@EventReceiver
public void onEventReceive(CustomData data) {
   //.обработка отправленных данных.//
}

Не забывайте также и отключиться в нужный момент EventChannel.disconnect(this);

Вы сможете передавать данные любого типа, а также подписываться на получение любых данных. Методов, помеченных аннотацией EventReceiver может быть несколько, если вы захотите принимать разные объекты.

READ ALSO
Как исключить дубликаты из HQL запроса?

Как исключить дубликаты из HQL запроса?

Есть метод который из таблицы с предложениями о продаже машин выбирает все марки включая дубликатыКак избавится от дубликатов а уровне запроса?

222
Origin null в cors фильтре JavaEE

Origin null в cors фильтре JavaEE

Подскажите пожалуйстаЕсть CORS фильтр:

243
Закрытие окна JavaFX

Закрытие окна JavaFX

Мне нужно закрыть окно, при нажатии на кнопку в другом окнеВот как я это попытался сделать, но выдает ошибку NullPointerException

562
Почему не получается запустить directoryChooser из JButton

Почему не получается запустить directoryChooser из JButton

Использую Window Builder в EclipseПри выполнении следующего кода получаю ошибку

254