私java.util.ConcurrentModificationException
は自分のアプリケーションでを取得しますが、それは私が急速に連続していくつかのタッチイベントを実行し、より速いデバイス(Galaxy S3)よりも遅いデバイス(Samsung Galaxy S)に大きな影響を与えるように見える場合に限ります。
対応する行のポイントの不透明度とデータを格納するために、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個のimeをタッチすることがあります。