2013-02-07 211 views
0

我的Android应用程序有它要求从Facebook MessageThreads对象列表的IntentService,解析JSON响应打造的对象的ArrayList:在再次ConcurrentModificationException的崩溃我的应用程序

ArrayList<MessageThread> mMessageThreads = new ArrayList<MessageThread>(); 

然后调用FB相同的服务,获取MessageThread ID的名称并将它们与MessageThread对象进行匹配。在这一点上,我有一个完整的MessageThread对象的ArrayList,我将它们插入到SQLite数据库。

// save to db and broadcast 
for (MessageThread message : mMessageThreads) { 
    ((FBClientApplication)getApplication()).getMessagesData().insertOrIgnore(message.toContentValues(); 
} 

其中:

public void insertOrIgnore(ContentValues values) { 
    SQLiteDatabase db = this.dbHelper.getWritableDatabase(); 
    db.insertWithOnConflict(TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE); 
} 

通过ACRA报道我看到间歇行

for (MessageThread message : mMessageThreads) 

抛出ConcurrentModificationException和应用程序forcloses。我无法在什么条件下进行隔离。我读了关于这个Exception,据我了解,当我们从ArrayList中删除项目时,它会发生,但我不会从列表中删除项目。任何指针来帮助解决这个问题,我们非常感谢。

回答

2

当您在迭代它时将项目添加到ArrayList时也会发生这种情况,您可能会在代码中执行此操作。

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

+0

@Pierre你可能想要用户迭代器来避免这个问题 – nhaarman

+0

@Niek谢谢,请看看这个。 –

2

什么,你可以尝试做的是当你迭代,而不是使用原来的你可以做一个拷贝在那里你的收藏,让你有这样的:

for (MessageThread message : new List<MessageThread>(mMessageThreads)) 

这将帮助你避免CuncurrentModificationException 。 现在,如果你真的想获得看上你可以使用synchronized块,如保护代码:

synchronized(mMessageThreads){ 
    for (MessageThread message : new List<MessageThread>(mMessageThreads)){ 
    ... 
} 

有了这个代码最后PICE您将限制访问mMessageThreads,如果它使用它有人会被锁定,所以如果其他人想使用它,需要等到第一个完成。

+0

谢谢,会试试这个。 –