私のプログラムには、プラグインがイベント リスナーを登録できるイベント ハンドラー システムがあります。
イベントは、このメソッドを使用して呼び出されます。
/**
* 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 イベントのチャンクがあります。子リスナーからのリストの変更を許可するにはどうすればよいですか?