private List<SimpleSubscriber> collectSubscribers(Object instance) { List<SimpleSubscriber> subscribers = new ArrayList<>(); Method[] methods = MethodUtils.getMethodsWithAnnotation(instance.getClass(), Subscribe.class, true, true); for (Method method : methods) { SimpleSubscriber subscriber = new SimpleSubscriber(instance, method); subscribers.add(subscriber); } return subscribers; }
public void post(Object event) { // cache always reset after register/unregister // so cache always match latest subscribersMap at last // te worst scenes is invoke collectSubscriberForEvent multiple times, no problem List<SimpleSubscriber> subscribers = subscribersCache .computeIfAbsent(event.getClass(), this::collectSubscriberForEvent); for (SimpleSubscriber subscriber : subscribers) { subscriber.dispatchEvent(event); } }
/** * subscribersMap almost stable<br> * so we not care for performance of collectSubscriberForEvent * @param eventClass */ private List<SimpleSubscriber> collectSubscriberForEvent(Class<?> eventClass) { List<SimpleSubscriber> subscribersForEvent = new ArrayList<>(); for (List<SimpleSubscriber> subscribers : subscribersMap.values()) { for (SimpleSubscriber subscriber : subscribers) { if (subscriber.getMethod().getParameterTypes()[0].isAssignableFrom(eventClass)) { subscribersForEvent.add(subscriber); } } } return subscribersForEvent; } }
public void post(Object event) { // cache always reset after register/unregister // so cache always match latest subscribersMap at last // te worst scenes is invoke collectSubscriberForEvent multiple times, no problem List<SimpleSubscriber> subscribers = subscribersCache .computeIfAbsent(event.getClass(), this::collectSubscriberForEvent); for (SimpleSubscriber subscriber : subscribers) { subscriber.dispatchEvent(event); } }
private List<SimpleSubscriber> collectSubscribers(Object instance) { List<SimpleSubscriber> subscribers = new ArrayList<>(); Method[] methods = MethodUtils.getMethodsWithAnnotation(instance.getClass(), Subscribe.class, true, true); for (Method method : methods) { SimpleSubscriber subscriber = new SimpleSubscriber(instance, method); subscribers.add(subscriber); } return subscribers; }
/** * subscribersMap almost stable<br> * so we not care for performance of collectSubscriberForEvent * @param eventClass */ private List<SimpleSubscriber> collectSubscriberForEvent(Class<?> eventClass) { List<SimpleSubscriber> subscribersForEvent = new ArrayList<>(); for (List<SimpleSubscriber> subscribers : subscribersMap.values()) { for (SimpleSubscriber subscriber : subscribers) { if (subscriber.getMethod().getParameterTypes()[0].isAssignableFrom(eventClass)) { subscribersForEvent.add(subscriber); } } } return subscribersForEvent; } }