En este video te explicamos en detalle todo el proceso para publicar una Aplicación Android…
Ejemplo tareas en segundo plano en Android: Aplicación de descarga de ficheros (II)
4.
Ejemplo tareas en segundo plano en Android: Aplicación de descarga de ficheros (II)
Seguimos mostrando la implementación de tareas en segundo plano en Android a través de un ejemplo práctico, una Aplicación donde descargamos ficheros, que empezamos a desarrollar en el anterior tutorial.
TareasSegundoPlano/src/com.academiaandroid.tareassegundoplano/TareaAsyncTask.java
Esta clase se encargará de mostrar en un componente ProgressDialog, la tarea de descarga y visionado de una imagen. Para ello esta clase debe heredar de la clase base AsyncTask, e implementar los métodos doInBackground(Params...) (para la conexión y descarga de la imagen), OnPreExecute() (se crea un objeto ProgressDialog para mostrar un mensaje de que la tarea se está ejecutando) y onPostExecute(Result...) (encargado de procesar y mostrar la imagen descargada).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
//Creamos una clase que herede de la clase base AsyncTask con los //tipos de parámetro de entrada, parámetro para la actualización del progreso //en el hilo principal y el resultado devuelto del procesamiento. public class TareaAsyncTask extends AsyncTask<String, Integer, Bitmap> { [...] //Método que ejecutará las tareas en segundo plano, encargado de conectarse //a una dirección URL con la imagen que se va a descargar. @Override protected Bitmap doInBackground(String... params) { try{ URL url = new URL(params[0]); URLConnection conection = url.openConnection(); conection.connect(); input = new BufferedInputStream(url.openStream(), 8192); bitmap = BitmapFactory.decodeStream(input); input.close(); }catch(Exception ex) { Toast.makeText(context, "Error en doInBackground: " + ex.getMessage(), Toast.LENGTH_LONG).show(); Log.e("Error en doInBackground: ", ex.getMessage()); } return bitmap; } [...] //Método que se ejecutará antes del procesamiento de la tarea, //indicando en un componente ProgressDialog, //que las tareas en segundo plano van a comenzar a ejecutarse @Override protected void onPreExecute() { try{ super.onPreExecute(); progressDialog = ProgressDialog.show(context, "Espere", "Descargando archivo..."); progressDialog.setCancelable(true); }catch(Exception ex) { Toast.makeText(context, "Error en onPreExecute: " + ex.getMessage(), Toast.LENGTH_LONG).show(); Log.e("Error en onPreExecute: ", ex.getMessage()); } } [...] //Método que se procesará justo después de ejecutarse la tarea en //segundo plano, encargado de mostrar la imagen descargada en la //pantalla. @Override public void onPostExecute(Bitmap bitmap) { try{ progressDialog.dismiss(); if(isCancelled()) { bitmap = null; } if (imageRef != null) { ImageView imageView = (ImageView) imageRef.get(); if (imageView != null && bitmap != null) { imageView.setImageBitmap(bitmap); Toast.makeText(context, "Mostrando imagen descargada", Toast.LENGTH_LONG).show(); } else Toast.makeText(context, "Error al descargar la imagen", Toast.LENGTH_LONG).show(); } }catch(Exception ex) { Toast.makeText(context, "Error en onPostExecute: " + ex.getMessage(), Toast.LENGTH_LONG).show(); Log.e("Error en onPostExecute: ", ex.getMessage()); } } [...] |
TareasSegundoPlano/res/layout/activity_main.xml
Como podemos comprobar en la imagen siguiente, se ha definido un TableLayout, con varios tableRow, encargados de mostrar de manera ordenada los diferentes componentes:
- Se puede apreciar como el primer TextView definido (‘Sin tipo seleccionado’) se encargará de mostrar información sobre el botón seleccionado.
- Los diferentes componentes de tipo Button permite lanzar una tarea o reiniciar/detener dicha tarea en segundo plano.
- Además se puede apreciar el componente ProgressBar encargado de mostrar el progreso de la tarea, actualizando el porcentaje de progreso en el componente TextView (‘Sin Progreso’).
- Una de las particularidades de esta aplicación, es definir un componente de tipo ImageView sin imagen asociada, para posteriormente mostrar en dicho lugar reservado la imagen descargada.
A continuación, se muestra el diseño de los componentes más representativos, encargados de mostrar información sobre las tareas ejecutadas en background. En este caso se muestran los componentes ProgressBar, TextView encargado de mostrar el porcentaje y el componente ImageView para mostrar la imagen descargada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<TableLayout android:layout_width="match_parent" android:layout_height="match_parent" > [...] <ProgressBar android:id="@+id/prgssTarea" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="25dp" android:contentDescription="Ejecutando Tarea" android:indeterminate="false" android:maxHeight="45dp" android:minHeight="55dp" /> <TextView android:id="@+id/tvEstadoProgreso" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" Sin Progreso" android:textAppearance="?android:attr/textAppearanceLarge" /> <ImageView android:id="@+id/imgAA" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="Posicion_imagen_descargada" /> </TableLayout> |
-
Permisos definidos en AndroidManifest.xml para la descarga de la imagen.
<uses-permission android:name="android.permission.INTERNET"/>
-
Tarea en background con las Clases Thread y Handler
-
Tarea en background con la Clase AsyncTask
Descarga del proyecto
DownloadEsta entrada tiene 2 comentarios
Los comentarios están cerrados.
Buenos días,
El fichero de descarga da error 403. ¿Podrían mirarlo?
Gracias
Hola Iván,
sí, disculpa, daba un error. Lo hemos vuelto a cargar y ahora ha ido bien.
Saludos