как избежать ConcurrentModificationException kotlin - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть список учетных записей, и когда я делаю длинный щелчок, я хочу удалить элемент из массива.Я пытаюсь удалить его из alerttdialog, но я получаю исключение ConcurrentModificationException.Вот где происходит сбой:

listAccounts.forEachIndexed { index, account ->
            if (idParamether == account.id) {
                listAccounts.remove(account)
            }
        }

Ответы [ 5 ]

0 голосов
/ 16 января 2019

Это на самом деле removeAll { predicate }, который представил kotlin stdlib.Таким образом, ваш код должен выглядеть следующим образом:

listAccounts.removeAll { it.id == idParamether }

см .: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/remove-all.html

Примечание: при кодировании в kotlin я предпочитаю придерживаться API-интерфейсов kotlin, это позволяет избежать таких проблем, как «Вызов требует уровня API24"

0 голосов
/ 22 ноября 2018
with(listAccounts.iterator()) {
    forEach {
        if (it.id == someObj.id) {
            // do some stuff with it
            oldSubscription = it
            remove()
        }
    }
}

То же решение, что и у SeekDaSky, но больше Kotlin'y

0 голосов
/ 26 апреля 2018

В Kotlin вы можете использовать removeIf{ predicate }.Что является сокращением к использованию Iterator.Полный оператор:

listAccounts.removeIf{ it == account.id }

объяснение см. Итерация по коллекции, исключение ConcurrentModificationException при удалении в цикле

0 голосов
/ 24 октября 2018

Попробуйте использовать ConcurrentLinkedQueue вместо списка, чтобы избежать этого исключения.Как упомянуто в ConcurrentLinkedQueue.Java, он упорядочивает элементы FIFO («первым пришел - первым обслужен»). Так что это позволит избежать проблем с изменением списка при его итерации.
Например:

val list = ConcurrentLinkedQueue<String>()
    list.add("toto")
    list.add("tata")
    list.add("titi")
    list.forEachIndexed { index, it ->
        if (index % 2 == 0) {
            list.remove("tata")
            System.out.println(it)
        }

    }

Выход:
Тото Тити

0 голосов
/ 26 апреля 2018

Это общая проблема с JVM: если вы хотите удалить элемент из коллекции во время его итерации, вам нужно использовать Iterators

example:

val myCollection = mutableListOf(1,2,3,4)
val iterator = myCollection.iterator()
while(iterator.hasNext()){
    val item = iterator.next()
    if(item == 3){
        iterator.remove()
    }
}

это позволит избежать ConcurrentModificationExceptions

Я надеюсь, что это ответило на ваш вопрос, хорошего дня

Редактировать : вы можете найти другое объяснение здесь , даже если это Java-код, проблема та же
Edit n ° 2 Ответ leonardkraemer покажет вам более дружественный к котлину способ сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...