Análisis y Diseñode SoftwareDepartamento de Ingeniería de Sistemas Telemáticoshttp://moodle.dit.upm.esHebrasCarlos A. Igle...
Hebras 2Temario● 4.1 Introducción a Android● 4.2 Introducción Desarrollo con Android● 4.3 Ejemplo Desarrollo y Depuración●...
Hebras 3TeoríaEjercicio práctico en el ordenadorAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / Exper...
Hebras 4● Android DevelopersBibliografíahttp://developer.android.com/guide/components/processes-and-threads.html
Hebras 5Objetivos● Entender cómo podemos manejar hebras yconcurrencia con android● Revisar los conceptos aprendidos deconc...
Hebras 6Hebras en Android● Android se basa en Linux, por lo que utilizael sistema de gestión de hebras de linux● Vamos a v...
Hebras 7Ejecución Monohebra● Por defecto, una aplicación Android ejecutasólo una hebra (single thread):– Cada instrucción ...
Hebras 8¿Qué pasa si se cuelga unaactividad?● El sistema operativo está atento, y si unaactividad no responde (normalmente...
Hebras 9Problema monohebra:bloqueo UISolución: usamos hebras
Hebras 10Ejemplo● Una aplicación que se descarga un ficheroAndroid in Practice, Collins et al., 2011,Cap 6, Manning. Ejemp...
Hebras 11Interfaz main.xml (I)
Hebras 12Interfaz main.xml (II)
Hebras 13Actividad:SimpleImageDownload (I)Creo un objeto Runnable paradescargar la imagen
Hebras 14Actividad:SimpleImageDownload (II)Al pinchar el botón, creo una hebra conel objeto Runnable y ejecuto start()
Hebras 15Para ver si ha terminado...trazas
Hebras 16Podemos depurarpara ver las hebrasProceso del sistemaNuestro proceso1. Click – Selecciono proceso2. Depurar3. Dep...
Hebras 17Nuestra hebraUI Thread
Hebras 18Análisis● ¿Cuánto vive la hebra?– Termina cuando termina el método run(). Puedeterminar más tarde que la Activida...
Hebras 19Soluciones● Problemas para actualizar UI desde lahebra– Creamos varias hebras (la UI y otras) y lascomunicamos: H...
Hebras 20Ejecución multihebra● Separamos tareas que tardan mucho endiferentes hebras● Así, simulamos mayor paralelismo, y ...
Hebras 21¿Cómo programamos esto enAndroid?● Definiendo un servicio que se ejecuta defondo y envía notificaciones a la inte...
Hebras 22Hebras● En Android, tenemos una hebra principal,la UIThread, que es responsable de lainterfaz● Esta hebra puede c...
Hebras 23Handler● Al comunicarnos con la hebra principal conun Handler, podemos hacer dos cosas:– Intercambiar mensajes de...
Hebras 24Comunicación hebrasMensajes<<Thread>>Hebra principal (UI)Handler h<<Thread>>Hebra secundaria 1<<Thread>>Hebra sec...
Hebras 25Esquema paso mensajesHebraPrincipal extends Activity {private Handler h = new Handler() {public void handleMessag...
Hebras 26Comunicación hebrasCola de Tareas<<Thread>>Hebra principal (UI)Handler h<<Thread>>Hebra secundaria 1<<Thread>>Heb...
Hebras 27Esquema paso tareasHebraPrincipal extends Activity {private Handler h = new Handler() {public void onCreate() {…T...
Hebras 28Más detalleSólo el thread principal tiene unobjeto Looper, a través del queaccede a la cola de mensajes enun bucle
Hebras 29Ejemplo con mensajes● Vamos a hacer una aplicación que vayamostrando el progreso de la tarea de fondo● Usaremos P...
Hebras 30Interfaz main.xml (I)
Hebras 31Interfaz main.xml (II)
Hebras 32Actividad (I)
Hebras 33Actividad (II)
Hebras 34Actividad (III)
Hebras 35Ejecución
Hebras 36Ejemplo paso de tareas
Hebras 37main.xml
Hebras 38Actividad (I)
Hebras 39Actividad (II)
Hebras 40Actividad (III)
Hebras 41Usando AsyncTask● Usar las hebras directamente es tedioso● Android proporciona AsyncTask– Permite crear una hebra...
Hebras 42AsyncTask – Uso básico● Hebras: UI Thread (UITh) y Background Thread(BGTh, la AsyncTask)●Tipos genéricos: Params,...
Hebras 43AsyncTask● Una AsyncTask tiene 3 tipos genéricos● AsyncTask<Params, Progress, Result>– Params – tipo de parámetro...
Hebras 44Métodos de AsyncTask●onPreExecute(): invocado por UIthjusto tras ejecutar la tarea●doInBackground(Params) – invoc...
Hebras 45Ejemplo AsyncTask
Hebras 46Interfaz main.xml
Hebras 47Actividad MainTask
Hebras 48Actividad MainTask (II)… → número deargumentosvariable, se procesacomo un array
Hebras 49Actividad MainTask (III)
Hebras 50Resumen● En este tema hemos aprendido a gestionarconcurrencia con tareas de fondo enAndroid● Hemos visto cómo ges...
Hebras 51¿Preguntas?
Upcoming SlideShare
Loading in...5
×

Tema 4.9 Hebras

296

Published on

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

  • Be the first to like this

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

No notes for slide

Tema 4.9 Hebras

  1. 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. 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. 3. Hebras 3TeoríaEjercicio práctico en el ordenadorAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / ExperimentaciónLeyenda
  4. 4. Hebras 4● Android DevelopersBibliografíahttp://developer.android.com/guide/components/processes-and-threads.html
  5. 5. Hebras 5Objetivos● Entender cómo podemos manejar hebras yconcurrencia con android● Revisar los conceptos aprendidos deconcurrencia
  6. 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. 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. 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. 9. Hebras 9Problema monohebra:bloqueo UISolución: usamos hebras
  10. 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. 11. Hebras 11Interfaz main.xml (I)
  12. 12. Hebras 12Interfaz main.xml (II)
  13. 13. Hebras 13Actividad:SimpleImageDownload (I)Creo un objeto Runnable paradescargar la imagen
  14. 14. Hebras 14Actividad:SimpleImageDownload (II)Al pinchar el botón, creo una hebra conel objeto Runnable y ejecuto start()
  15. 15. Hebras 15Para ver si ha terminado...trazas
  16. 16. Hebras 16Podemos depurarpara ver las hebrasProceso del sistemaNuestro proceso1. Click – Selecciono proceso2. Depurar3. Depurar hebras4. Ver hebras (actualizar)
  17. 17. Hebras 17Nuestra hebraUI Thread
  18. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 29. Hebras 29Ejemplo con mensajes● Vamos a hacer una aplicación que vayamostrando el progreso de la tarea de fondo● Usaremos ProgressBar
  30. 30. Hebras 30Interfaz main.xml (I)
  31. 31. Hebras 31Interfaz main.xml (II)
  32. 32. Hebras 32Actividad (I)
  33. 33. Hebras 33Actividad (II)
  34. 34. Hebras 34Actividad (III)
  35. 35. Hebras 35Ejecución
  36. 36. Hebras 36Ejemplo paso de tareas
  37. 37. Hebras 37main.xml
  38. 38. Hebras 38Actividad (I)
  39. 39. Hebras 39Actividad (II)
  40. 40. Hebras 40Actividad (III)
  41. 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. 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. 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. 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. 45. Hebras 45Ejemplo AsyncTask
  46. 46. Hebras 46Interfaz main.xml
  47. 47. Hebras 47Actividad MainTask
  48. 48. Hebras 48Actividad MainTask (II)… → número deargumentosvariable, se procesacomo un array
  49. 49. Hebras 49Actividad MainTask (III)
  50. 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. 51. Hebras 51¿Preguntas?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×