Вы можете переопределить removeHandler
, чтобы сохранить обработчики, запланированные для удаления.
public void removeHandler(IEventHandler h){
mHandlersToRemove.add(h);
}
, а затем удалить их перед выполнением какой-либо диспетчеризации.
public void dispatchEvent(){
mHandlers.removeAll(mHandlersToRemove);
mHandlersToRemove.clear();
...
Вы также можете удалить по адресуконец dispatchEvent
, но тогда вы можете удалить только из в обработчиках .(В противном случае вы можете отправить обработчики, которые были удалены.)
Если вы заинтересованы в теоретическом решении этой проблемы, вы можете посмотреть, как C ++ реализует итераторы.В векторе stl итератор имеет метод стирания , который возвращает следующий действительный итератор.
Это будет выглядеть примерно так:
for (itr = listA.begin(); itr != listA.end(); )
{
if ( shouldRemove(*itr) ) {
itr = listA.erase(itr);
}
else {
++itr;
}
}
Конечно, этопример не относится к вашему вопросу, так как он написан на C ++, и было бы неудобно распространять новый итератор до цикла верхнего уровня (или добавлять возвращаемое значение к вашему вызову для условия «удалить»).Но, может быть, где-то есть похожая реализация Java:)