定义类:java
MyEventBus 事件总线安全
方法:并发
Event 事件异步
EventHandler 事件处理器post
如下以两张图来表达实现的原理this
注册:spa
分发:线程
实现EventBus最关键的地方是,维护一个事件/处理器的注册表。在收到注册请求的时候,将内容加到注册表中;在收到调用请求的时候,从注册表中取出对应的处理器并调用。code
定义事件-事件处理器:cdn
public class Event<T> {
private T entity;
public Event() {
}
public Event(T entity) {
this.entity = entity;
}
}
复制代码
public interface EventHandler {
void handle(Event event);
}
复制代码
定义EventBus:
//注册集合
private Map<Class<? extends Event>, List<EventHandler>> map = new HashMap<Class<? extends Event>, List<EventHandler>>();
private Executor executor = Executors.newFixedThreadPool(10);
public void register(Class<? extends Event> event, EventHandler eventHandler) {
List<EventHandler> list = map.get(event);
if(list != null) {
list.add(eventHandler);
} else {
list = new ArrayList<EventHandler>();
list.add(eventHandler);
map.put(event,list);
}
}
public void post(final Event event) {
List<EventHandler> list = map.get(event.getClass());
if(list != null) {
for (final EventHandler eventHandler : list) {
executor.execute(new Runnable() {
public void run() {
eventHandler.handle(event);
}
});
}
}
}
public void unRegister(Class<? extends Event> event, EventHandler eventHandler) {
List<EventHandler> list = map.get(event);
if(list != null) {
list.remove(eventHandler);
}
}
复制代码
流程调用:
//实例化,并注册
MyEventBus myEventBus = new MyEventBus();
EventHandler handler = new EventHandler() {
public void handle(Event event) {
User user = (User) event.getEntity();
System.out.println(user.getId());
}
};
myEventBus.register(OpenUserEvent.class,handler);
//开户业务
User user = new User();
user.setId("3");
user.setName("test");
//实例化事件,并发送
OpenUserEvent openUserEvent = new OpenUserEvent();
openUserEvent.setEntity(user);
myEventBus.post(openUserEvent);
复制代码
以上咱们实现了一个简单的EventBus,但这个EventBus还存在如下问题:
下章节中,以Google的EventBus为例,说明如何解决以上问题