0

私のアプリケーションは、特定の日付の着信通話と SMS に関するデータをログに記録し、それらをリストに保持します。新しい電話または SMS が着信したときに、その日付のエントリが既に存在するかどうかをアプリケーションで確認する必要があります。この場合、アプリケーションでリストの値をインクリメントする必要があります。

ただし、これを実行しようとすると、次のエラーが発生します: 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
}
4

1 に答える 1

1

foryour などのループはfor (Log log : logs)、実際には under を使用Iteratorして要素を反復処理します (この場合は yourはCollectionどこですか)。logsCollection

よく知られている事実は、ループまたは反復中Iteratorに を変更しようとしてはならないということです。Collectionそれ以外の場合は、ConcurrentModificationException.

SO と CME に関する Q&A はすでに多数あるIteratorため、重複するアドバイスではなく、ここで提供されているソリューションを参照することをお勧めします。

于 2013-09-29T05:53:09.173 に答える