Your SlideShare is downloading. ×
Tema 4.9 Hebras
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Tema 4.9 Hebras

279

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
279
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
17
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Análisis y Diseñode SoftwareDepartamento de Ingeniería de Sistemas Telemáticoshttp://moodle.dit.upm.esHebrasCarlos A. Iglesias <cif@gsi.dit.upm.es>v1.0 22/04/2013
  • 2. Hebras 2Temario● 4.1 Introducción a Android● 4.2 Introducción Desarrollo con Android● 4.3 Ejemplo Desarrollo y Depuración● 4.4 Actividades● 4.5 Interfaces de Usuario● 4.6 Intenciones● 4.7 Acceso a Datos● 4.8 Preferencias● 4.9 Hebras
  • 3. Hebras 3TeoríaEjercicio práctico en el ordenadorAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / ExperimentaciónLeyenda
  • 4. Hebras 4● Android DevelopersBibliografíahttp://developer.android.com/guide/components/processes-and-threads.html
  • 5. Hebras 5Objetivos● Entender cómo podemos manejar hebras yconcurrencia con android● Revisar los conceptos aprendidos deconcurrencia
  • 6. Hebras 6Hebras en Android● Android se basa en Linux, por lo que utilizael sistema de gestión de hebras de linux● Vamos a ver cómo usar las hebras alprogramar en Android
  • 7. Hebras 7Ejecución Monohebra● Por defecto, una aplicación Android ejecutasólo una hebra (single thread):– Cada instrucción se ejecuta, una acontinuación de otra– Cada llamada es bloqueante– La hebra que se ejecuta es la hebra de interfazde usuario (UI thread), es responsable depintar y de capturar los eventos del usuario– Ejecución monohebra:
  • 8. Hebras 8¿Qué pasa si se cuelga unaactividad?● El sistema operativo está atento, y si unaactividad no responde (normalmente 5segundos), nos avisa para que lamatemos– Diálogo ANR (Application Not Responding)
  • 9. Hebras 9Problema monohebra:bloqueo UISolución: usamos hebras
  • 10. Hebras 10Ejemplo● Una aplicación que se descarga un ficheroAndroid in Practice, Collins et al., 2011,Cap 6, Manning. Ejemplo disponible enhttp://www.manning.org/collins
  • 11. Hebras 11Interfaz main.xml (I)
  • 12. Hebras 12Interfaz main.xml (II)
  • 13. Hebras 13Actividad:SimpleImageDownload (I)Creo un objeto Runnable paradescargar la imagen
  • 14. Hebras 14Actividad:SimpleImageDownload (II)Al pinchar el botón, creo una hebra conel objeto Runnable y ejecuto start()
  • 15. Hebras 15Para ver si ha terminado...trazas
  • 16. Hebras 16Podemos depurarpara ver las hebrasProceso del sistemaNuestro proceso1. Click – Selecciono proceso2. Depurar3. Depurar hebras4. Ver hebras (actualizar)
  • 17. Hebras 17Nuestra hebraUI Thread
  • 18. Hebras 18Análisis● ¿Cuánto vive la hebra?– Termina cuando termina el método run(). Puedeterminar más tarde que la Actividad / Servicio quelo inició → No debería tener referencias a estosobjetos, puede darnos problemas● Es una mala solución – No podemos indicaren la interfaz que hemos terminado● ¿Qué pasa si damos muchas veces al botón?→ Generamos muchas hebras...
  • 19. Hebras 19Soluciones● Problemas para actualizar UI desde lahebra– Creamos varias hebras (la UI y otras) y lascomunicamos: Handler● Problemas si piden muchas hebras– Creamos un pool de hebras y sólo tenemosese número activo– Así además reutilizamos las hebras y no hacefalta crearlas cada vez: ThreadPoolExecutor
  • 20. Hebras 20Ejecución multihebra● Separamos tareas que tardan mucho endiferentes hebras● Así, simulamos mayor paralelismo, y lainterfaz responde sin penalizaciones● Casos normales de una hebra:– Un servicio de actualización que se ejecuta defondo (background)– Un calculo que lleva mucho tiempo– Almacenamiento de datos en tarjeta SD
  • 21. Hebras 21¿Cómo programamos esto enAndroid?● Definiendo un servicio que se ejecuta defondo y envía notificaciones a la interfaz (loveremos, es la opción mejor)● Usando una hebra (thread) de fondo– Usando la clase Thread y Handler directamente• Las hebras no pueden notificar directamente a la hebrade interfaz UI– Usando la clase AsyncTask, que facilita ejecutartareas de fondo y publicar resultados en la hebraUI principal
  • 22. Hebras 22Hebras● En Android, tenemos una hebra principal,la UIThread, que es responsable de lainterfaz● Esta hebra puede crear otras hebrassecundarias que NO pueden acceder a lainterfaz● La comunicación entre la hebra ppal y lassecundarias se hace con un Handler
  • 23. Hebras 23Handler● Al comunicarnos con la hebra principal conun Handler, podemos hacer dos cosas:– Intercambiar mensajes de la cola de mensajesdel Handler– Pasar objetos Runnables para que los ejecutela hebra principalhttp://developer.android.com/reference/android/os/Handler.html
  • 24. Hebras 24Comunicación hebrasMensajes<<Thread>>Hebra principal (UI)Handler h<<Thread>>Hebra secundaria 1<<Thread>>Hebra secundaria 1<<Runnable>>Runnable11. Message msg = h.obtainMessage()2. h.sendMessage(msg)handleMessage(Message msg)Constructor conpatrón de diseñoFactoría parareutilizar objetos
  • 25. Hebras 25Esquema paso mensajesHebraPrincipal extends Activity {private Handler h = new Handler() {public void handleMessage(Message msg) {// procesa mensajes}metodo() {// crea una hebra secundariaThread th = new Thread(new Runnable(){// método de la hebra secundaria...Message msg = h.obtainMessage();h.sendMessage(msg);...});}}
  • 26. Hebras 26Comunicación hebrasCola de Tareas<<Thread>>Hebra principal (UI)Handler h<<Thread>>Hebra secundaria 1<<Thread>>Hebra secundaria 1<<Runnable>>Runnable r2h.post(r1)h.postAtFrontOfQueue(r2)<<Runnable>>Runnable r1
  • 27. Hebras 27Esquema paso tareasHebraPrincipal extends Activity {private Handler h = new Handler() {public void onCreate() {…Thread th = new Thread(r2, “Background”);th.start();}private Runnable r1 = new Runnable() {public void run() {// actualizo UI}}private Runnable r2 = new Runnable() {public void run() {// ejecuto cosash.post(r1);}}}
  • 28. Hebras 28Más detalleSólo el thread principal tiene unobjeto Looper, a través del queaccede a la cola de mensajes enun bucle
  • 29. Hebras 29Ejemplo con mensajes● Vamos a hacer una aplicación que vayamostrando el progreso de la tarea de fondo● Usaremos ProgressBar
  • 30. Hebras 30Interfaz main.xml (I)
  • 31. Hebras 31Interfaz main.xml (II)
  • 32. Hebras 32Actividad (I)
  • 33. Hebras 33Actividad (II)
  • 34. Hebras 34Actividad (III)
  • 35. Hebras 35Ejecución
  • 36. Hebras 36Ejemplo paso de tareas
  • 37. Hebras 37main.xml
  • 38. Hebras 38Actividad (I)
  • 39. Hebras 39Actividad (II)
  • 40. Hebras 40Actividad (III)
  • 41. Hebras 41Usando AsyncTask● Usar las hebras directamente es tedioso● Android proporciona AsyncTask– Permite crear una hebra de fondo que publicaen la hebra UI sin tener que programarThreads o Handlers– Definimos una tarea asíncrona que se ejecutade fondo y publica sus resultados en la hebraUI
  • 42. Hebras 42AsyncTask – Uso básico● Hebras: UI Thread (UITh) y Background Thread(BGTh, la AsyncTask)●Tipos genéricos: Params, Progress, Result● Estados principales– onPreExecute (UITh)– doInBackground (BGTh)– onProgressUpdate(UITh)– onPostExecutre(UITh)● Método auxiliar– publishProgress (BGTh)
  • 43. Hebras 43AsyncTask● Una AsyncTask tiene 3 tipos genéricos● AsyncTask<Params, Progress, Result>– Params – tipo de parámetros enviados a latarea para su ejecución– Progress – tipo de las unidades de progresopublicadas durante su ejecución– Result – resultado de la ejecución de la tarea● Si no usamos un tipo, lo ponemos Void (conV)
  • 44. Hebras 44Métodos de AsyncTask●onPreExecute(): invocado por UIthjusto tras ejecutar la tarea●doInBackground(Params) – invocadopor BGTh justo tras onPreExecute●onProgressUpdate(Progress) –invocado por UITh tras una llamada deBGTh a publishProgress(Progress)●onPostExecute(Result) invocado porUITh justo tras terminar BGTh
  • 45. Hebras 45Ejemplo AsyncTask
  • 46. Hebras 46Interfaz main.xml
  • 47. Hebras 47Actividad MainTask
  • 48. Hebras 48Actividad MainTask (II)… → número deargumentosvariable, se procesacomo un array
  • 49. Hebras 49Actividad MainTask (III)
  • 50. Hebras 50Resumen● En este tema hemos aprendido a gestionarconcurrencia con tareas de fondo enAndroid● Hemos visto cómo gestionar directamentehebras, comunicarlas con Handlers, y cómousar AsyncTasks● Por último, cómo darle un mejor aspectovisual y crear recursos alternativos
  • 51. Hebras 51¿Preguntas?

×