gpt4 book ai didi

java - 在 onTouchEvent 中编辑 ArrayList

转载 作者:太空狗 更新时间:2023-10-29 13:38:28 24 4
gpt4 key购买 nike

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


MyActivity.java - 将 View 设置为 MyView .

MyThread.java - 包含 surfaceHolder , 来电 update()render()MyView.java 中发挥作用

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

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


我的问题是:

MyView类,在 render()函数我循环遍历 ArrayList/Vector 的内容在MyPuzzle内举行类并将它们绘制到 Canvas 上。但是,我偶尔会收到 indexOutOfBounds错误(可能每 10 次一次),尽管从 i=0; i<arraylist.size()... 开始循环

在同一个MyView类,在 onTouchEvent函数,我有从 ArrayList/Vector 添加/删除项目的代码正在绘制。

我的索引越界错误可能是由 onTouchEvent 引起的吗?正在与 render() 同时处理函数正在遍历 ArrayList/Vector并将元素绘制到屏幕上?

我尝试实现一个系统,其中 onTouchEvent s 没有立即处理,而是添加到 ArrayList 中队列,并且只在 render() 之前处理叫做。这似乎已经解决了这个问题,我已经做了有限的测试。这听起来对吗?这让我有些发疯。

提前感谢您的帮助,对于问题写得不好,我深表歉意,我可以添加您可能需要的更多详细信息。

最佳答案

IndexOutOfBounds 可能是迭代线程最初看到大小为 N 的列表并开始从 0 到 N 的迭代的情况的直接结果。Thread-2 进入并从列表中删除使其有效地成为 N-1,因此,如果 Thread-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);
}
}

关于java - 在 onTouchEvent 中编辑 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com