我java.util.ConcurrentModificationException
在我的应用程序中得到了一个,但前提是我快速连续执行多个触摸事件,并且似乎对较慢的设备(三星 Galaxy S)而不是较快的设备(Galaxy S3)有更大的影响。
我有一个队列,其中存储了一个 int 数组,用于存储相应线的点的不透明度和数据。当不透明度达到 0 时,我从队列中删除该行,因此不再绘制它。
这是堆栈跟踪:
01-10 14:06:27.847: E/AndroidRuntime(2081): java.util.ConcurrentModificationException
01-10 14:06:27.847: E/AndroidRuntime(2081): at java.util.LinkedList$LinkIterator.next(LinkedList.java:124)
01-10 14:06:27.847: E/AndroidRuntime(2081): at com.android.mcameron.singletrack.Options$TestSurfaceView.drawLinesInvalid(Options.java:559)
01-10 14:06:27.847: E/AndroidRuntime(2081): at com.android.mcameron.singletrack.Options$TestSurfaceView.run(Options.java:438)
01-10 14:06:27.847: E/AndroidRuntime(2081): at java.lang.Thread.run(Thread.java:1019)
这些是遍历队列的 2 个函数,我执行删除操作。
private void drawLinesInvalid() {
paint.setColor(Color.RED);
for (Iterator<int[]> iterator = invalidLines.iterator(); iterator.hasNext();) {
int[] invalidLine = iterator.next(); // Line 559 with the error
float[] line = {invalidLine[1], invalidLine[2], invalidLine[3], invalidLine[4]};
Xfermode originalXfermode = paint.getXfermode();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mCanvas.drawLines(line, paint);
paint.setXfermode(originalXfermode);
paint.setAlpha(invalidLine[0]);
mCanvas.drawLines(line, paint);
}
}
private void decreaseLineOpacity() {
for (Iterator<int[]> iterator = invalidLines.iterator(); iterator.hasNext();) {
int[] line = iterator.next();
if (line[0] <= 0) {
iterator.remove();
}
}
for (Iterator<int[]> iterator = invalidLines.iterator(); iterator.hasNext();) {
int[] line = iterator.next();
line[0] -= 10;
}
}
我在这里查看了一些其他问题,大多数人似乎在使用 Foreach 循环以及remove()
在队列而不是迭代器上执行操作时遇到问题。我认为这两者都不适用于这里。也像上面说的那样,我可以摆脱触摸,所以这不是立即发生的错误。在抛出异常之前,我有时可以触摸 30-50 次。