我正在做一个应用程序,其中有2个视图从SurfaceView扩展,称为CanvasView。
我有一个左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 lineList?
谢谢。
答案 0 :(得分:1)
ArrayList
课程不是Thread Safe。
使用Collections.synchronizedList()
代替ArrayList
。
答案 1 :(得分:1)
请勿使用简化版的for循环
for (CharSequence line : lineList) {
...
..
}
相反,使用传统的。但是,您必须自己处理数据一致性。
for (int i = 0; i < lineList.size(); i++) {
CharSequence line = lineList.get(i)
..
}
答案 2 :(得分:1)
列表不是线程安全的,当多个线程尝试修改同一个列表时,它最终会出现并发修改异常。
使用ConcurrentLinkedQueue
或CopyOnWriteArrayList
。
请参阅链接 - Is there a concurrent List in Java's JDK?
Collections.synchronizedList()是另一种提供对列表的同步访问的替代方案。