gpt4 book ai didi

java - Android 单线程并发

转载 作者:太空宇宙 更新时间:2023-11-04 11:56:23 25 4
gpt4 key购买 nike

我仍处于 Android(Java)游戏开发的早期阶段,并且在游戏循环中添加/删除对象时遇到了并发问题。

该应用程序有 2 个独立的 fragment ,一个是 Controller ,另一个是显示游戏循环的 SurfaceView。 Controller 具有提示创建对象的按钮,然后将其添加到游戏循环中。并发问题看似随机出现,但主要是在从存储它的 ArrayList 中删除一个对象并将另一个对象添加到其中以进行绘制时出现。

崩溃并不是均匀发生的,也不是在运行过程中的同一点发生的,所以我在这里不知所措。我已经将所有 For-each 循环切换到 ListIterator 添加/删除调用,认为这可以避免并发问题,但事实证明它是无效的。

我是否必须对我的对象添加使用锁定,直到下一次完成draw()之后或者还有其他方法吗?

提前致谢。

编辑:

// Adds new Objects to ArrayList
ListIterator<Projectile> iterator = curr_player.getProjectiles().listIterator();
iterator.add(new_p);

// Code to remove Object when it goes off View Boundaries
public boolean projectileBoundary()
{
Projectile p;
for (ListIterator<Projectile> iterator = curr_player.getProjectiles().listIterator(); iterator.hasNext();)
{
p = iterator.next();
if (p.getX() > p.getXMax())
{
iterator.remove();
return true;
}

}

return false;

}

// Objects drawn to canvas using this function
public void drawProjectiles()
{
for (Iterator<Projectile> iterator = curr_player.getProjectiles().iterator(); iterator.hasNext();)
{
Projectile p = iterator.next();
drawProjectile(p);
}

}

如前所述,只有在删除发生之前删除应用程序时,应用程序才不会崩溃。这表明更新 ArrayList 时出现问题,该 ArrayList 是在同时添加新对象的情况下绘制的。

应用程序因错误而终止:java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 处的 java.util.ConcurrentModificationException

最佳答案

如果是并发问题则使用线程安全的数据结构。使用CopyOnWriteArrayList而不是ArrayList。 CopyOnWriteArrayList 是线程安全的

关于java - Android 单线程并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41365449/

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