2017-12-06 2 views
2

Es sei zu entfernen, haben die folgenden ZuhörerWas die eleganteste Art, wie ich einen Listener aus einer Liste von einem Rückruf

interface MyListener { 
    fun onResult(result: Int) 
} 

und dass meine Klasse enthält eine Liste dieser Zuhörer

val MyListenerList = ArrayList<MyListener>() 

Meine Zweifel: Wenn jemand, der den Listener registriert hat, ihn abmelden möchte (wenn er aus der Liste entfernt wird), wenn der Callback (onResult) ausgelöst wird, was ist der eleganteste Weg, dies zu tun, wenn man ihn direkt während der Listeniteration aufruft läuft wird eine ConcurrentModificationException verursachen ?

+0

Welche Sprache verwenden Sie? Java? – StephaneM

+0

Ich benutze Kotlin: D –

Antwort

3

Nicht iterieren über MyListenerList, eine Kopie von MyListenerList erstellen und über die Kopie iterieren. Auf diese Weise kann die Entfernung unter MyListenerList ohne eine ConcurrentModificationException verursacht werden.

Zum Beispiel:

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

oder

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

Vielen Dank für Ihre Antwort, @hudsonb. Ich werde es einfach nicht als richtig bezeichnen, denn ich möchte prüfen, ob es einen anderen eleganten Weg gibt. –

+1

Dies ist, wie es allgemein unterstützt wird. Eine andere Option, die Sie in Betracht ziehen könnten, wäre die Verwendung einer 'CopyOnWriteArrayList' anstelle von' ArrayList'. – hudsonb

Verwandte Themen