Java Android:在两个线程之间共享列表
我正在做一个应用程序,其中我有两个从SurfaceView扩展的视图,叫做CanvasView 我有左视图和右视图。 这两个CanvasView都实例化了一个UIThread,它从线程扩展而来。 CanvasView本身被传递到线程中,如下所示:Java Android:在两个线程之间共享列表,java,android,multithreading,arraylist,Java,Android,Multithreading,Arraylist,我正在做一个应用程序,其中我有两个从SurfaceView扩展的视图,叫做CanvasView 我有左视图和右视图。 这两个CanvasView都实例化了一个UIThread,它从线程扩展而来。 CanvasView本身被传递到线程中,如下所示: public void surfaceCreated(SurfaceHolder holder) { uiThread = new UIThread(this); uiThread.setRunning(true); uiThread.st
public void surfaceCreated(SurfaceHolder holder) {
uiThread = new UIThread(this);
uiThread.setRunning(true);
uiThread.start();
}
在每个CanvasView,onDraw()中,我访问一个列表。这个列表基本上由一个要绘制的事物的列表组成,在左画布和右画布上基本相同
for (CharSequence line : lineList) {
...
..
}
每当我的应用程序需要在lineList中绘制项目时,它就会崩溃
java.util.ConcurrentModificaitoneException
在两个线程之间“共享”Arraylist行列表的正确方法是什么
谢谢。不支持
ArrayList
类
使用
Collections.synchronizedList()
而不是ArrayList
类不可用
使用
Collections.synchronizedList()
而不是ArrayList
类不可用
使用
Collections.synchronizedList()
而不是ArrayList
类不可用
使用
Collections.synchronizedList()
而不是ArrayList
不要使用for循环的简化版本
for (CharSequence line : lineList) {
...
..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性
for (int i = 0; i < lineList.size(); i++) {
CharSequence line = lineList.get(i)
..
}
for(int i=0;i
不要使用for循环的简化版本
for (CharSequence line : lineList) {
...
..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性
for (int i = 0; i < lineList.size(); i++) {
CharSequence line = lineList.get(i)
..
}
for(int i=0;i
不要使用for循环的简化版本
for (CharSequence line : lineList) {
...
..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性
for (int i = 0; i < lineList.size(); i++) {
CharSequence line = lineList.get(i)
..
}
for(int i=0;i
不要使用for循环的简化版本
for (CharSequence line : lineList) {
...
..
}
相反,使用传统的方法。但是,您必须自己处理数据一致性
for (int i = 0; i < lineList.size(); i++) {
CharSequence line = lineList.get(i)
..
}
for(int i=0;i
列表不是线程安全的,当多个线程试图修改同一列表时,它将以并发修改异常结束
使用ConcurrentLinkedQueue
或CopyOnWriteArrayList
请参阅以下链接-
Collections.synchronizedList()是另一种替代方法,它将提供对列表的同步访问。列表不是线程安全的,当多个线程尝试修改同一列表时,它将导致并发修改异常 使用
ConcurrentLinkedQueue
或CopyOnWriteArrayList
请参阅以下链接-
Collections.synchronizedList()是另一种替代方法,它将提供对列表的同步访问。列表不是线程安全的,当多个线程尝试修改同一列表时,它将导致并发修改异常 使用
ConcurrentLinkedQueue
或CopyOnWriteArrayList
请参阅以下链接-
Collections.synchronizedList()是另一种替代方法,它将提供对列表的同步访问。列表不是线程安全的,当多个线程尝试修改同一列表时,它将导致并发修改异常 使用
ConcurrentLinkedQueue
或CopyOnWriteArrayList
请参阅以下链接-
Collections.synchronizedList()是另一个选项,它将提供对列表的同步访问。嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。嗨,Jason,对不起,这两者之间有什么区别?第一个是编译器。由于列表是一个集合,编译器使用迭代器转换for循环。迭代器是引发异常的人。但是,如果将数据存储在数组中,则不会引发异常。如果您的数据是一个简单数组,编译器将使用常规for循环。感谢我的问题是使用CopyOnWriteArrayList和Erm解决的,没有使用那么多线程XDHi@lppier,您可以在onDraw中使用CopyOnWriteArrayList。您没有性能问题吗?@JasonChueh没有注意到任何问题,还有其他选择吗?@lppier,我只是想知道您是否面临任何问题。如果没有,这应该是一个很好的解决方案:)谢谢我的问题是使用CopyOnWriteArrayList和Erm解决的,没有使用那么多线程XDHi@lppier,您可以在onDraw中使用CopyOnWriteArrayList。您没有性能问题吗?@JasonChueh没有注意到任何问题,还有其他选择吗?@lppier,我只是想知道您是否面临任何问题。如果没有,这应该是一个很好的解决方案:)Tha