En este ejercicio modificacaremos la aplicación ThreadingSimple para que realice la operación de carga de la imagen utilizando un AsyncTask, además lo ampliaremos para que también permita cancelar la operación en el Worker Thread desde el UI-Thread.
Crear un nuevo proyecto llamado ThreadingAsyncTask con el código y layouts del proyecto ThreadingSimple.
Añadir en el Layout una barra de progreso de ancho total encima del botón “Load Icon”. Inicialmente estará invisible.
Definir la variable mDelay a 500. Este valor será el tiempo de espera que simula el avance de cada tramo de la barra de progreso, es decir, cada 500 ms se actualizará la barra de progreso.
En el listener del botón “Load Icon” llamaremos al método execute() de un objeto AsyncTask que deberemos crear. Al método execute, en este ejemplo, le pasaremos el ID del recurso que queremos cargar (el bitmap).
Definiremos una clase llamada LoadIconTask, que extiende de AsyncTask, en la que crearemos un método privado sleep con el código
private void sleep() { try { Thread.sleep(mDelay); } catch (InterruptedException e) { Log.e(TAG, e.toString()); } }
Además sobrecargaremos los métodos siguientes:
protected void onPreExecute() {
En este método haremos visible la barra de progreso.
protected Bitmap doInBackground(Integer... resId) {
Cargaremos el bitmap y lo devolveremos como valor de retorno.
Llamaremos en bucle al método Sleep para retardar simuladamente la carga durante un total de 5 segundos. Cada 500ms llamaremos al metodo publishProgress pasándole el iterador del bucle que representa el porcentaje de avance de la barra de progreso.
protected void onProgressUpdate(Integer... values) {
En este método actualizaremos la barra de progreso al valor pasado en values. Nota: values es un array.
protected void onPostExecute(Bitmap result) {
En este método volveremos invisible la barra de progreso y mostraremos el
bitmap que es recibido en el parámetro result.
ThreadingAsyncTaskCancel
Crear un nuevo proyecto llamado ThreadingAsyncTaskCancel con el código y layouts del proyecto ThreadingAsyncTask.
Añadir un nuevo botón al final del layout con el texto “Cancel” que inicialmente esté invisible.
Cuando se pulse el botón “Load Icon” el botón Cancel se hará visible.
Asignar un Listener al click del botón Cancel para que llame al método cancel() del AsyncTask.
En el bucle de carga comprobar, mediante isCancelled(), si se ha cancelado la carga.
Crear el método onCancelled que:
- Mostrará un Toast indicando que la carga se ha cancelado,
- Reseteará la barra de progreso a 0% y la volverá invisible
- Volverá a ocultar el botón de Cancel
Una vez cancelado se podrá llamar nuevamente a “Load Icon” y todo funcionará desde cero.
Os dejo el código de los ejercicios resueltos