1

私のプログラムには、プラグインがイベント リスナーを登録できるイベント ハンドラー システムがあります。
イベントは、このメソッドを使用して呼び出されます。

/**
 * 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 イベントのチャンクがあります。子リスナーからのリストの変更を許可するにはどうすればよいですか?

4

1 に答える 1