从回调中删除列表中侦听器的最优雅方法是什么?

时间:2017-12-06 13:02:05

标签: java kotlin listener concurrentmodification

假设我有以下监听器

interface MyListener {
    fun onResult(result: Int)
}

并且我的类包含此侦听器的列表

val MyListenerList = ArrayList<MyListener>()

我的疑问是:如果注册了监听器的人想要在回调(onResult)被触发时取消注册(从列表中删除),那么最优雅的方法是什么,考虑到在列表迭代运行时直接调用它将导致ConcurrentModificationException

1 个答案:

答案 0 :(得分:3)

不要对MyListenerList进行迭代,复制MyListenerList并遍历副本。这样,移除可以在MyListenerList上进行,而不会导致ConcurrentModificationException

例如:

ArrayList(MyListenerList).forEach { it.onRemove(n) }

MyListenerList.toArray().forEach { it.onRemove(n) }