Hay algo que echo de menos con la noción de sincronización de código en Android.java.util.ConcurrentModificationException en la animación de Android
Escenario
Siempre hay 3 elementos dibujados en la pantalla. Cada imagen se almacena en una ArrayList (lstGraphics). Para este propósito, uso SurfaceView. Una vez que el usuario toque una imagen, se eliminará el mercado de obtención de imagen y se agregará uno nuevo.
Ejemplos de código:
AnimationHideThread
...
@Override
public void run() {
Canvas c;
while (run) {
c = null;
try {
c = panel.getHolder().lockCanvas(null);
synchronized (panel.getHolder()) {
panel.updatePhysics();
panel.manageAnimations();
panel.onDraw(c);
}
} finally {
if (c != null) {
panel.getHolder().unlockCanvasAndPost(c);
}
}
}
}
...
Así como puede parecer a primera vista que updatePhysics(). Esto significa que calculo la dirección hacia donde se moverá cada imagen. Aquí también eliminaré las imágenes clicadas de mi lista. Después de eso, verifico si necesito agregar un nuevo ítem en mi lista en manageAnimations() y luego el último paso dibujar todo.
public class Panel extends SurfaceView implements SurfaceHolder.Callback {
....
public void manageAnimations()
{
synchronized (this.getHolder()) {
...
while (lstGraphics.size()<3) {
lstGraphics.add(createRandomGraphic());
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
synchronized (getHolder()) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//... check if a image has been clicked and then set its property
graphic.setTouched(true);
}
}
return true;
}
}
public void updatePhysics() {
synchronized (getHolder()) {
for (Graphic graphic : lstGraphics) {
//.... Do some checks
if (graphic.isTouched())
{
lstGraphics.remove(graphic);
}
}
}
}
@Override
public void onDraw(Canvas canvas) {
/// draw the backgrounds and each element from lstGraphics
}
public class Graphic {
private Bitmap bitmap;
private boolean touched;
private Coordinates initialCoordinates;
....
}
El error que consigo es:
> 03-01 10:01:53.365: ERROR/AndroidRuntime(454): Uncaught handler: thread Thread-12 exiting due to uncaught exception
> 03-01 10:01:53.365: ERROR/AndroidRuntime(454): java.util.ConcurrentModificationException
> 03-01 10:01:53.365: ERROR/AndroidRuntime(454): at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:66)
> 03-01 10:01:53.365: ERROR/AndroidRuntime(454): at com.test.customcontrols.Panel.updatePhysics(Panel.java:290)
> 03-01 10:01:53.365: ERROR/AndroidRuntime(454): at com.test.customcontrols.AnimationHideThread.run(AnimationHideThread.java:41)
Cualquier ayuda es muy apreciada. Gracias.
creé Lista toremove y lo ha probado, trabajó como un encanto. Gracias por tu ayuda. – Alin
@Alin, debe considerar la solución con 'Iterator'. Crear objetos innecesarios en un bucle de juego generalmente es una mala idea. –