gpt4 book ai didi

java - 来自称为异步任务的静态方法的并发修改异常

转载 作者:行者123 更新时间:2023-11-29 09:41:28 24 4
gpt4 key购买 nike

我有一个静态方法,我从 doInBackGround() 中的 Asynctask 调用它

方法中有这部分代码:

    ArrayList<Message> messagesList = new ArrayList<Message>();
if (!clearList) {
messagesList.addAll(messages.getMessagesList());
for (Message msg : messagesList) {
if (msg.getId().length() == 0) {
messagesList.remove(msg);
}
}
}

它有时会抛出“并发修改异常”,我已经尝试将方法声明为“同步”但它仍然没有帮助,而且我无法将 block 声明为同步,因为它是一个静态方法并且没有'这是引用。

如果我需要启动另一个异步任务,我也曾尝试停止正在运行的异步任务,但它也没有帮助。

感谢帮助。

最佳答案

这与同步无关。您正在使用迭代器遍历 messagesList,然后在迭代期间使用 remove 对其进行修改。您不能那样做,因为如果在迭代期间修改列表,ArrayList 的迭代器会失败。来自 the docs :

The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException.

你的 enhanced for loop只是使用 Iterator 的语法糖,因此您可以直接将其显式化,然后使用迭代器的 remove method :

Iterator<Message> it = messagesList.iterator();
while (it.hasNext()) {
if (it.next().getId().length == 0) {
it.remove();
}
}

或者,您可以只使用一个简单的 for 循环向后运行并索引到 ArrayList(因为 get(int) 很便宜和 ArrayList 上的恒定时间操作,并非所有 List 都适用):

int index;
for (index = messagesList.length - 1; index >= 0; --index) {
if (messagesList.get(index).getId().length == 0) {
messagesList.remove(index);
}
}

关于java - 来自称为异步任务的静态方法的并发修改异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13137698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com