Как на java реализовать что бы по определённому событию вызывались определённые методы, которые подписаны на это событие. То есть если нажали button1 в наш метод (контроллер) передалось что произошло событие Events1 и в соответствие с этим событием вызываются методы , которые подписаны на это событие.
Вам вполне подойдет концепция EventBus (шины данных) https://github.com/greenrobot/EventBus.
Она нужна для того, чтобы независимые компоненты могли общаться между собой путем отправки и приема событий.
Вы можете посмотреть в сторону готовых библиотек, а можете попробовать реализовать шину сами, это не сложно.
@Documented
@Retention(value= RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface EventReceiver
{
}
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
может быть несколько, если вы захотите принимать разные объекты.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть метод который из таблицы с предложениями о продаже машин выбирает все марки включая дубликатыКак избавится от дубликатов а уровне запроса?
Мне нужно закрыть окно, при нажатии на кнопку в другом окнеВот как я это попытался сделать, но выдает ошибку NullPointerException
Использую Window Builder в EclipseПри выполнении следующего кода получаю ошибку