我的应用程序会记录有关特定日期的来电和短信的数据,并将其保存在列表中。我希望应用程序在新的电话呼叫或短信进入时检查该日期是否已有条目。如果是这种情况,我希望应用程序在列表中增加一个值。
但是,当我尝试这样做时,我收到此错误:java.util.ConcurrentModificationException
我该如何解决这个问题?
我的代码看起来像这样
public void addLog(String phonenumber, String type, long date, int incoming, int outgoing)
{
//Check if log exists or else create it.
Log newLog = new Log(phonenumber, type, date, incoming, outgoing);
//Iterates through logs
for (Log log : logs)
{
if (log.getPhonenumber() == phonenumber && log.getDate() == date && log.getType() == type)
{
updateLog(newLog, log.getId());
}
else
{
android.util.Log.i("Datamodel", "Adding log");
logs.add(newLog);
//add to database
}
}
}
public void updateLog(Log newLog, long id)
{
//check for outgoing or incoming
if (newLog.getIncoming() == 1)
{
for (Log log : logs)
{
if (log.getId() == id)
{
//Increments incoming
int incoming = log.getIncoming();
android.util.Log.i("Datamodel", "Updating incoming");
log.setIncoming(incoming++);
}
else
{
//Increments outgoing
int outgoing = log.getOutgoing();
android.util.Log.i("Datamodel", "Updating outgoing");
log.setOutgoing(outgoing++);
}
}
}
//Update the list
//Add to database
}
答案 0 :(得分:1)
for
循环(例如您的for (Log log : logs)
)实际上使用下方的Iterator
来迭代Collection
中的元素(其中logs
是您的在这种情况下Collection
。)
关于Iterator
的一个众所周知的事实是,当你循环或迭代它时,你不能试图修改Collection
;否则将导致ConcurrentModificationException
。
关于Iterator
和CME,已经有大量关于SO的Q& As,所以我建议查看提供的解决方案here而不是我重复建议。