Как обрабатывать ConcurrentModificationException в Android - PullRequest
7 голосов
/ 08 июля 2011

Я пытаюсь удалить элемент из ArrayList. Иногда появляется исключение "java.util.ConcurrentModificationException".

Сначала я попытался удалить их с помощью array_list_name.remove (i), но это не удалось, и некоторых людей попросили использовать итератор.Поэтому мой текущий код выглядит следующим образом.

for (Iterator<Collectable> iter = array_list_name.iterator(); iter.hasNext();) {
   Collectable s = iter.next();
   if (s.equals(array_list_name.get(id))){
       iter.remove();
       return true;
   }
}

И я вызываю "array_list_name" внутри функции onDraw () в представлении.мой взгляд это SurfaceView.Может ли кто-нибудь предложить мне, как удалить элементы из ArrayList без получения этой ошибки.

Ответы [ 4 ]

7 голосов
/ 08 июля 2011

Попробуйте использовать java.util.concurrent.CopyOnWriteArrayList вместо ArrayList

6 голосов
/ 08 июля 2011

Из комментариев видно, что ваш ArrayList<Collectable> доступен из метода onDraw() в одном потоке с помощью пользовательского интерфейса, одновременно с удалением из него элементов в другом потоке.

Итак, почему бы просто не обернуть оба аксессуара в

synchronized(array_list_name)
{
    // UI access code or item removal code
}

Обратите внимание, что это может сделать ваш интерфейс медленным, если удаление элементов занимает много времени. Если это так, рассмотрите возможность составления списка всех индексов элементов, которые нужно удалить, и удалите их в тесном синхронизированном цикле после итерации по всему списку.

Обновление

Мне кажется, весь ваш фрагмент кода можно было бы упростить до:

synchronized(array_list_name)
    return array_list_name.remove(id);
0 голосов
/ 21 ноября 2017

Вы когда-нибудь думали использовать Vector List ?Если вам нужна поточно-ориентированная реализация, вы должны использовать Vector вместо ArrayList . Vector список используется так же, как и ArrayList .Просто измените его тип с помощью Vector .

Небезопасное использование

ArrayList<FutureTask> futureTasks;

Измените с

Vector<FutureTask> futureTasks;

Вот и все.

0 голосов
/ 08 июля 2011

Вы можете создать защитную копию списка следующим образом:

List copy = new ArrayList(array_list_name);
for (Iterator<Collectable> iter = copy.iterator(); iter.hasNext();) {
   Collectable s = iter.next();
   if (s.equals(copy.get(id))){
       iter.remove();
       return true;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...