我的程序中有一个事件处理程序系统,插件可以在其中注册事件侦听器。
使用此方法调用事件。
/**
* Pass an event to registered {@link EventHandler}s.
*
* @param event Event to pass.
*/
public void callEvent(Event event) {
synchronized (this) {
HandlerList handlers = event.getHandlers();
List<RegisteredListener> listeners = handlers.getRegisteredListeners();
for (RegisteredListener registration : listeners) {
try {
registration.callEvent(event);
} catch (Throwable ex) {
Log.e(TAG, "Could not pass event " + event.getClass().getSimpleName() + " to " + registration.getListener().getClass().getName(), ex);
}
}
}
}
HandlerList
只是一个容器List<RegisteredListener>
。
一些事件侦听器在被调用后需要注销,这会导致ConcurrentModificationException
循环中。该系统对性能至关重要,我想避免List.toArray()
为每个事件做或类似的副本;通常有 100 个事件的块。如何允许从子侦听器修改列表?