2013-02-07 140 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

謝謝,會試試這個。 –