Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在onTouchEvent中编辑ArrayList_Java_Android_Multithreading_Arraylist_Touch Event - Fatal编程技术网

Java 在onTouchEvent中编辑ArrayList

Java 在onTouchEvent中编辑ArrayList,java,android,multithreading,arraylist,touch-event,Java,Android,Multithreading,Arraylist,Touch Event,我正在编写一个具有以下基本结构的Android应用程序: MyActivity.java-将视图设置为MyView MyThread.java-包含surfaceHolder,在MyView.java中调用update()和render()函数 MyView.java-使用render()函数绘制画布,更新MyPuzzle类,处理触摸事件 MyPuzzle.java-包含元素的ArrayList/Vector 我的问题是: 在MyView类中,在render()函数中,我循环遍历MyPuzz

我正在编写一个具有以下基本结构的Android应用程序:


MyActivity.java
-将视图设置为
MyView

MyThread.java
-包含
surfaceHolder
,在
MyView.java
中调用
update()
render()
函数

MyView.java
-使用
render()
函数绘制画布,更新
MyPuzzle
类,处理触摸事件

MyPuzzle.java
-包含元素的
ArrayList/Vector


我的问题是:


MyView
类中,在
render()
函数中,我循环遍历
MyPuzzle
类中持有的
ArrayList/Vector
的内容,并将它们绘制到画布上。然而,尽管从
I=0循环,我偶尔会得到
indexOutOfBounds
错误(可能每10次一次);iIndexOutOfBounds可能是一种情况的直接结果,在这种情况下,迭代线程最初会看到大小为N的列表,并开始从0到N进行迭代。线程-2进入并从列表中删除,使其有效地成为N-1,因此如果线程-1尝试读取List.get(N),则会出现异常

如果列表的深度不是很大,并且您没有删除和添加一个完整的丢失交换,请使用
CopyOnWriteArrayList
执行列表实现。否则,您将需要对列表的所有操作(例如,包括迭代)进行
同步

public void render(){
  synchronized(list){
    for(int i =0; i <list.size();i++){
      //....
    }
  }
}
public void update(Object element){
 synchronized(list){
  list.remove(element);  
 }
}
public void render(){
已同步(列表){

对于(int i=0;我能告诉我们您在哪里出错的代码吗?它会帮助我们帮助我们所有人。感谢这个答案,它对我来说绝对有意义。我的ArrayList不是特别大,它通常有大约30个相对简单的对象。在每次更新中,我最多会交换/删除一个或两个元素,所以我假设使用CopyOnWriteArrayList在这里可以吗?再次干杯。没问题!CopyOnWriteArrayList应该可以!