Java ConcurrentModificationException使我的应用程序崩溃

Java ConcurrentModificationException使我的应用程序崩溃,java,android,Java,Android,我的Android应用程序有一个IntentService,它从Facebook请求MessageThreads对象列表,解析JSON响应以构建对象的ArrayList: ArrayList<MessageThread> mMessageThreads = new ArrayList<MessageThread>(); 其中: public void insertOrIgnore(ContentValues values) { SQLiteDatabase db

我的Android应用程序有一个IntentService,它从Facebook请求MessageThreads对象列表,解析JSON响应以构建对象的ArrayList:

ArrayList<MessageThread> mMessageThreads = new ArrayList<MessageThread>();
其中:

public void insertOrIgnore(ContentValues values) {
    SQLiteDatabase db = this.dbHelper.getWritableDatabase();
    db.insertWithOnConflict(TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE);
}
通过ACRA报告,我看到断断续续的

for (MessageThread message : mMessageThreads) 

抛出一个
ConcurrentModificationException
,应用程序将关闭。我无法在什么条件下隔离。我读到了这个
异常
,据我所知,当我们在遍历
ArrayList
时从该列表中删除项时,就会发生这种情况,但我并没有从列表中删除项。非常感谢任何有助于解决此问题的指针。

当您在迭代
ArrayList
时向其添加项时,也会发生这种情况,您可能会在本代码中这样做


一般来说,
ArrayList
中发生的任何“结构修改”都会在迭代过程中导致CME。

在迭代过程中向
ArrayList
中添加项目时也会发生这种情况,这看起来像是在本代码中可能会发生的


一般来说,
ArrayList
中发生的任何“结构修改”都可能在迭代时导致CME。

您可以尝试的是,当您迭代集合而不是使用原始集合时,您可以在那里制作一个副本,这样您就可以得到如下结果:

for (MessageThread message : new List<MessageThread>(mMessageThreads))
for(MessageThread消息:新列表(mMessageThreads))
这将帮助您避免CuncurrentModificationException。 现在,如果您真的想变得更花哨,您可以使用以下同步块来保护代码:

synchronized(mMessageThreads){
    for (MessageThread message : new List<MessageThread>(mMessageThreads)){
    ...
}
synchronized(mMessageThreads){
for(MessageThread消息:新列表(mMessageThreads)){
...
}

使用最后一段代码,您将限制对mMessageThreads的访问,如果有人在使用它,它将被锁定,因此如果有人想使用它,则需要等到第一段代码完成。

您可以尝试的是,当您迭代集合而不是使用原始集合时,您可以在那里创建一个副本,这样您就可以例如:

for (MessageThread message : new List<MessageThread>(mMessageThreads))
for(MessageThread消息:新列表(mMessageThreads))
这将帮助您避免CuncurrentModificationException。 现在,如果您真的想变得更花哨,您可以使用以下同步块来保护代码:

synchronized(mMessageThreads){
    for (MessageThread message : new List<MessageThread>(mMessageThreads)){
    ...
}
synchronized(mMessageThreads){
for(MessageThread消息:新列表(mMessageThreads)){
...
}

使用最后一段代码,您将限制对mMessageThreads的访问,如果有人在使用它,它将被锁定,因此如果有人想使用它,则需要等待第一段代码完成。

@Pierre您可能希望使用迭代器来避免这种情况problem@Niek谢谢,我们来看看这个。@Pierre您可能想使用迭代器to避免这种情况problem@Niek谢谢,我来看看这个。