M0286_Libro Curso

2: Avanzado en Android

private ArrayList mElements = new

ArrayList();

public Panel(Context context) { super(context);

getHolder().addCallback(this); mThread = new ViewThread(this);

} public void doDraw(Canvas canvas) { canvas.drawColor(Color. BLACK ); for (Element element : mElements) { element.doDraw(canvas); } } @Override public boolean onTouchEvent(MotionEvent event) { mElements.add(new Element(getResources(), (int) } Si en este punto ejecutamos la aplicación, podemos observar que funciona, pero que se va a bloquear y dar un cierre forzado (FC) al azar. Esto va a ser debido a una ConcurrentModificationException , que se produce en el método doDraw() . La razón tiene una sencilla explicación: mientras la clase ViewThread llama al método doDraw() y se ejecuta en el bucle, es posible cambiar la lista con la que itera, añadiendo un nuevo elemento a la lista. Para evitarlo, podemos usar la función synchronized(), que impide una sincronización de escritura y el acceso de lectura al objeto dado. Así que la llamada add() espera hasta que el dibujo está acabado y el event.getX(),(int) event.getY())); return super.onTouchEvent(event);

objeto mElements está libre para poder modificarlo. Añadiremos el siguiente código en la clase Panel : public void doDraw(Canvas canvas) { canvas.drawColor(Color. BLACK ); synchronized (mElements) {

for (Element element : mElements) { element.doDraw(canvas); } }

} @Override

public boolean onTouchEvent(MotionEvent event) { synchronized (mElements) { mElements.add(new Element(getResources(), (int) event.getX(), (int) event.getY())); } return super.onTouchEvent(event); }

97

Made with FlippingBook - Online catalogs