问题
Im trying to delete item from a ArrayList. Some times it pops an exception, "java.util.ConcurrentModificationException".
First i tried to remove them by array_list_name.remove(i), but it failed and some people were asked to use Iterator instead. So my current code is as follows.
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;
}
}
And i call "array_list_name" inside onDraw() function in view. my view is a SurfaceView. Can any one suggest me how to delete items from ArrayList without getting this error.
回答1:
Try using java.util.concurrent.CopyOnWriteArrayList
instead of ArrayList
回答2:
Seems from the comments that your ArrayList<Collectable>
is accessed from the onDraw()
method in one thread, by the UI, concurrently with you removing items from it in another thread.
So, why not just wrap both accessors in a
synchronized(array_list_name)
{
// UI access code or item removal code
}
Note that this might make your UI laggy if removing items takes a long time. If this is the case, consider making a list of all item indexes to be removed, and remove them in a tight synchronized loop after iterating over the whole list.
Update
It seems to me your whole code snippet could be simplified to just:
synchronized(array_list_name)
return array_list_name.remove(id);
回答3:
You could create a defensive copy of the list like so:
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;
}
}
回答4:
Have you ever thought to use Vector List ? If you need a thread-safe implementation, you should use Vector instead of ArrayList. Vector list's usage is same with ArrayList. Just change its type with Vector.
Unsafe usage
ArrayList<FutureTask> futureTasks;
Change with
Vector<FutureTask> futureTasks;
That's all.
来源:https://stackoverflow.com/questions/6621991/how-to-handle-concurrentmodificationexception-in-android