2015-07-29 2 views
0

Я занимаюсь с приложением, в котором у меня есть 2 вида, которые простираются от SurfaceView под названием CanvasView.Android: Обмен списками между двумя потоками

У меня есть левый CanvasView и правый CanvasView. Оба этих CanvasView создают экземпляр UIThread, который простирается от Thread. Сам CanvasView передается в нить, как это:

public void surfaceCreated(SurfaceHolder holder) { 
    uiThread = new UIThread(this); 
    uiThread.setRunning(true); 
    uiThread.start(); 
} 

В каждом CanvasView, OnDraw(), я доступ к списку. Этот список в основном состоит из списка вещей для рисования, которые по существу одинаковы как на левых, так и на правых холстах.

for (CharSequence line : lineList) { 
... 
.. 
} 

Всякий раз, когда мое приложение необходимо обратить элементы в LineList, он выходит из строя говоря java.util.ConcurrentModificaitonException.

Каков правильный способ «разделить» линейку линий Arraylist между двумя потоками?

спасибо.

ответ

1

Список не является потокобезопасным, и если несколько потоков пытаются изменить один и тот же список, это приведет к исключению параллельной модификации.

Использовать ConcurrentLinkedQueue или CopyOnWriteArrayList.

см по ссылке - Is there a concurrent List in Java's JDK?

Collections.synchronizedList() является другой альтернативой, которая обеспечит синхронизированный доступ к списку.

+0

Спасибо, что моя проблема была решена с помощью CopyOnWriteArrayList и Erm, не используя столько потоков XD – lppier

+0

Привет @lppier, вы используете CopyOnWriteArrayList в onDraw. У вас нет проблемы с производительностью? –

+0

@JasonChueh ничего не заметил, есть ли альтернатива? – lppier

1

Не использовать упрощенную версию для цикла

for (CharSequence line : lineList) { 
    ... 
    .. 
} 

Вместо этого используйте один традиционный. Тем не менее, вы должны самостоятельно обрабатывать согласованность данных.

for (int i = 0; i < lineList.size(); i++) { 
    CharSequence line = lineList.get(i) 
    .. 
} 
+0

Привет, Джейсон, извините, но в чем разница между этими двумя здесь? – lppier

+1

Первый - это сахара-компилятор. Поскольку список представляет собой набор, компилятор переводит цикл for с итератором. Итератором является тот, кто выбрасывает исключение. Однако, если вы храните свои данные в массиве, исключение не будет выбрано. Компилятор будет использовать регулярный цикл, если ваши данные являются простым массивом. –

Смежные вопросы