M0286_Libro Curso
2: Avanzado en Android
private ArrayList
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