1

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をタッチすることがあります。

4

2 に答える 2

1

Peter Lawreyのおかげで、私はCopyOnWriteArrayList

キューを次のように変更しました。

private CopyOnWriteArrayList<int[]> invalidLines = new CopyOnWriteArrayList<int[]>();

次に、decreaseLineOpacityを次のように更新しました。

private void decreaseLineOpacity() {
    int position = 0;
    for (Iterator<int[]> iterator = invalidLines.iterator(); iterator.hasNext();) {
        int[] line = iterator.next();
        if (line[0] <= 0) {
            invalidLines.remove(position);
        }
        position++;
    }

    for (Iterator<int[]> iterator = invalidLines.iterator(); iterator.hasNext();) {
        int[] line = iterator.next();
        line[0] -= 10;
        Log.d("Counting", "Opacity: "+ line[0]);
    }
}

私は数分間クリックしてきましたが、例外はスローされていないので、良さそうです

于 2013-01-10T13:53:15.533 に答える
0

ListIteratorLinkedListアンドロイドで使用される変更をサポートしています。したがって、@ Peter Lawreyが提案したように、問題はマルチスレッドに関連している必要があります。両方の方法を同期してみてください。これがパフォーマンスに影響する場合は試すことができCopyOnWriteArrayListますが、リストのコピーを反復処理しているため、スレッドで反復処理しているときに最新の変更が表示されるとは限りません。

于 2013-01-10T13:55:02.227 に答える