Análisis y Diseño      de SoftwareInterfaces de UsuarioHebras e Internacionalización.Interfaz Yamba      Carlos A. Iglesia...
LeyendaTeoríaEjercicio práctico en el ordenadorAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / Experi...
Temario● 4.1   Introducción a Android [Gar10, cap1-2 ]● 4.2   Desarrollo con Android [Gar10, cap3-5]● 4.3   Interfaces de ...
Bibliografía●   Libro de texto:    – [Gar10] Learning Android, Marko Gargenta,        OReilly, 2010. Disponible en        ...
Objetivos●    Entender cómo funcionan la concurrencia y    las hebras en Android●   Aprender a internacionalizar una aplic...
Hebras en Android●   Android se basa en Linux, por lo que utiliza    el sistema de gestión de hebras de linux●   Vamos a v...
Ejecución Monohebra●   Por defecto, una aplicación Android ejecuta    sólo una hebra (single thread):    –   Cada instrucc...
¿Qué pasa si se cuelga una           actividad?●   El sistema operativo está atento, y si una    actividad no responde (no...
Problema monohebra:           bloqueo UISolución: usamos hebras                          Interfaces de Usuario   9
Ejemplo●   Una aplicación que se descarga un fichero                       Android in Practice, Collins et al., 2011,     ...
Interfaz main.xml (I)            Interfaces de Usuario   11
Interfaz main.xml (II)            Interfaces de Usuario   12
Actividad:SimpleImageDownload (I)            Creo un objeto Runnable para            descargar la imagen             Inter...
Actividad:SimpleImageDownload (II)             Al pinchar el botón, creo una hebra con             el objeto Runnable y ej...
Para ver si ha terminado...          trazas              Interfaces de Usuario   15
Podemos depurar          para ver las hebras                                       2. Depurar                             ...
Nuestra hebra                          UI Thread       Interfaces de Usuario          17
Análisis● ¿Cuánto     vive la hebra?  –   Termina cuando termina el método run(). Puede      terminar más tarde que la Act...
Soluciones●   Problemas para actualizar UI desde la    hebra    –   Creamos varias hebras (la UI y otras) y las        com...
Ejecución multihebra●   Separamos tareas que tardan mucho en    diferentes hebras●    Así, simulamos mayor paralelismo, y ...
¿Cómo programamos esto en         Android?●    Definiendo un servicio que se ejecuta de    fondo y envía notificaciones a ...
Hebras●    En Android, tenemos una hebra principal,    la UIThread, que es responsable de la    interfaz●    Esta hebra pu...
Handler●   Al comunicarnos con la hebra principal con    un Handler, podemos hacer dos cosas:    –   Intercambiar mensajes...
Comunicación hebras                   Mensajes                                           <<Thread>>   Constructor con     ...
Esquema paso mensajesHebraPrincipal extends Activity {        private Handler h = new Handler() {        public void handl...
Comunicación hebras             Cola de Tareas                              <<Runnable>> <<Runnable>>                     ...
Esquema paso tareasHebraPrincipal extends Activity {        private Handler h = new Handler() {        public void onCreat...
Más detalle           Sólo el thread principal tiene un           objeto Looper, a través del que          accede a la col...
Ejemplo con mensajes●   Vamos a hacer una aplicación que vaya    mostrando el progreso de la tarea de fondo●   Usaremos Pr...
Interfaz main.xml (I)            Interfaces de Usuario   30
Interfaz main.xml (II)            Interfaces de Usuario   31
Actividad (I)        Interfaces de Usuario   32
Actividad (II)        Interfaces de Usuario   33
Actividad (III)         Interfaces de Usuario   34
Ejecución     Interfaces de Usuario   35
Ejemplo paso de tareas            Interfaces de Usuario   36
main.xml     Interfaces de Usuario   37
Actividad (I)        Interfaces de Usuario   38
Actividad (II)        Interfaces de Usuario   39
Actividad (III)         Interfaces de Usuario   40
Usando AsyncTask●   Usar las hebras directamente es tedioso●   Android proporciona AsyncTask    –   Permite crear una hebr...
AsyncTask – Uso básico● Hebras:UI Thread (UITh) y Background Thread (BGTh, la AsyncTask)●Tipos   genéricos: Params, Progre...
AsyncTask●   Una AsyncTask tiene 3 tipos genéricos●   AsyncTask<Params, Progress, Result>    –   Params – tipo de parámetr...
Métodos de AsyncTask       ● onPreExecute():   invocado por UIth        justo tras ejecutar la tarea       ● doInBackgroun...
Ejemplo AsyncTask         Interfaces de Usuario   45
Interfaz main.xml         Interfaces de Usuario   46
Actividad MainTask          Interfaces de Usuario   47
Actividad MainTask (II)                                … → número de                                  argumentos          ...
Actividad MainTask (III)             Interfaces de Usuario   49
Yamba. StatusActivity2 (I)              Interfaces de Usuario   50
StatusActivity2 (I)           Interfaces de Usuario   51
Retoques finales●   Ya tenemos la aplicación●   Podemos    –   Añadir que descuente el        número de caracteres    –   ...
ContarCaracteres main.xml             Interfaces de Usuario   53
ContarCaracteres - TextWatcher (I)          Interfaces de Usuario   54
ContarCaracteres -TextChangedListener (III)             Interfaces de Usuario   55
Personalización●En Android en res podemos hacer carpetas con recursos para  –   Una orientación res/layout-land/status.xml...
Asistente recursos   alternativos          Interfaces de Usuario   57
Lo que llevamos hecho...             Interfaces de Usuario   58
Resumen●   En este tema hemos aprendido a gestionar    concurrencia con tareas de fondo en    Android●   Hemos visto cómo ...
¿Preguntas?      Interfaces de Usuario   60
Upcoming SlideShare
Loading in …5
×

Tema 4 3_4_interfaces_de_usuario

945 views

Published on

Tema 4.3.4. Hebras e Internacionalización. Interfaz Yamba.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
945
On SlideShare
0
From Embeds
0
Number of Embeds
163
Actions
Shares
0
Downloads
44
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Tema 4 3_4_interfaces_de_usuario

  1. 1. Análisis y Diseño de SoftwareInterfaces de UsuarioHebras e Internacionalización.Interfaz Yamba Carlos A. Iglesias <cif@gsi.dit.upm.es> Departamento de Ingeniería de Sistemas Telemáticos http://moodle.dit.upm.es
  2. 2. LeyendaTeoríaEjercicio práctico en el ordenadorAmpliación de conocimientosLectura / Vídeo / PodcastPráctica libre / Experimentación Interfaces de Usuario 2
  3. 3. Temario● 4.1 Introducción a Android [Gar10, cap1-2 ]● 4.2 Desarrollo con Android [Gar10, cap3-5]● 4.3 Interfaces de Usuario [Gar10, cap6] – 4.3.1 Ejemplo SobreTeleco – 4.3.2 Layouts y Views – 4.3.3 Widgets y Trazas. Interfaz del proyecto Yamba – 4.3.4. Hebras e internacionalización. Interfaz Yamba.● 4.4 Intenciones y Servicios [Gar10, cap7-8]● 4.5 Acceso a Datos [Gar10, cap9] Interfaces de Usuario 3
  4. 4. Bibliografía● Libro de texto: – [Gar10] Learning Android, Marko Gargenta, OReilly, 2010. Disponible en http://ofps.oreilly.com/titles/9781449390501/ – Capítulos 6 – http://www.youtube.com/watch?v=-P1eiRy-klk&list=PLE08A97D36D5A255F&index=10&feature=plpp_vid – http://www.youtube.com/watch? v=CzKYgi80yUw&list=PLE08A97D36D5A255F&index=11&feature=plpp_video● Android Developers – http://developer.android.com/guide/topics/fundamentals.html – http://developer.android.com/guide/topics/ui/index.html Interfaces de Usuario 4
  5. 5. Objetivos● Entender cómo funcionan la concurrencia y las hebras en Android● Aprender a internacionalizar una aplicación Interfaces de Usuario 5
  6. 6. Hebras en Android● Android se basa en Linux, por lo que utiliza el sistema de gestión de hebras de linux● Vamos a ver cómo usar las hebras al programar en Android Interfaces de Usuario 6
  7. 7. Ejecución Monohebra● Por defecto, una aplicación Android ejecuta sólo una hebra (single thread): – Cada instrucción se ejecuta, una a continuación de otra – Cada llamada es bloqueante – La hebra que se ejecuta es la hebra de interfaz de usuario (UI thread), es responsable de pintar y de capturar los eventos del usuario – Ejecución monohebra: Interfaces de Usuario 7
  8. 8. ¿Qué pasa si se cuelga una actividad?● El sistema operativo está atento, y si una actividad no responde (normalmente 5 segundos), nos avisa para que la matemos – Diálogo ANR (Application Not Responding) Interfaces de Usuario 8
  9. 9. Problema monohebra: bloqueo UISolución: usamos hebras Interfaces de Usuario 9
  10. 10. Ejemplo● Una aplicación que se descarga un fichero Android in Practice, Collins et al., 2011, Cap 6, Manning. Ejemplo disponible en http://www.manning.org/collins Interfaces de Usuario 10
  11. 11. Interfaz main.xml (I) Interfaces de Usuario 11
  12. 12. Interfaz main.xml (II) Interfaces de Usuario 12
  13. 13. Actividad:SimpleImageDownload (I) Creo un objeto Runnable para descargar la imagen Interfaces de Usuario 13
  14. 14. Actividad:SimpleImageDownload (II) Al pinchar el botón, creo una hebra con el objeto Runnable y ejecuto start() Interfaces de Usuario 14
  15. 15. Para ver si ha terminado... trazas Interfaces de Usuario 15
  16. 16. Podemos depurar para ver las hebras 2. Depurar Proceso del sistema 3. Depurar hebras 4. Ver hebras (actualizar) Nuestro proceso1. Click – Selecciono proceso Interfaces de Usuario 16
  17. 17. Nuestra hebra UI Thread Interfaces de Usuario 17
  18. 18. Análisis● ¿Cuánto vive la hebra? – Termina cuando termina el método run(). Puede terminar más tarde que la Actividad / Servicio que lo inició → No debería tener referencias a estos objetos, puede darnos problemas● Es una mala solución – No podemos indicar en la interfaz que hemos terminado● ¿Quépasa si damos muchas veces al botón? → Generamos muchas hebras... Interfaces de Usuario 18
  19. 19. Soluciones● Problemas para actualizar UI desde la hebra – Creamos varias hebras (la UI y otras) y las comunicamos: Handler● Problemas si piden muchas hebras – Creamos un pool de hebras y sólo tenemos ese número activo – Así además reutilizamos las hebras y no hace falta crearlas cada vez: ThreadPoolExecutor Interfaces de Usuario 19
  20. 20. Ejecución multihebra● Separamos tareas que tardan mucho en diferentes hebras● Así, simulamos mayor paralelismo, y la interfaz responde sin penalizaciones● Casos normales de una hebra: – Un servicio de actualización que se ejecuta de fondo (background) – Un calculo que lleva mucho tiempo – Almacenamiento de datos en tarjeta SD Interfaces de Usuario 20
  21. 21. ¿Cómo programamos esto en Android?● Definiendo un servicio que se ejecuta de fondo y envía notificaciones a la interfaz (lo veremos, 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 hebra de interfaz UI – Usando la clase AsyncTask, que facilita ejecutar tareas de fondo y publicar resultados en la hebra UI principal Interfaces de Usuario 21
  22. 22. Hebras● En Android, tenemos una hebra principal, la UIThread, que es responsable de la interfaz● Esta hebra puede crear otras hebras secundarias que NO pueden acceder a la interfaz● La comunicación entre la hebra ppal y las secundarias se hace con un Handler Interfaces de Usuario 22
  23. 23. Handler● Al comunicarnos con la hebra principal con un Handler, podemos hacer dos cosas: – Intercambiar mensajes de la cola de mensajes del Handler – Pasar objetos Runnables para que los ejecute la hebra principal http://developer.android.com/reference/android/os/Handler.html Interfaces de Usuario 23
  24. 24. Comunicación hebras Mensajes <<Thread>> Constructor con Hebra principal (UI) patrón de diseño Factoría para reutilizar objetos Handler h handleMessage(Message msg)1. Message msg = h.obtainMessage()2. h.sendMessage(msg) <<Thread>> <<Thread>> Hebra secundaria 1 Hebra secundaria 1 Interfaces de Usuario 24
  25. 25. Esquema paso mensajesHebraPrincipal extends Activity { private Handler h = new Handler() { public void handleMessage(Message msg) { // procesa mensajes } metodo() { // crea una hebra secundaria Thread th = new Thread(new Runnable(){ // método de la hebra secundaria ... Message msg = h.obtainMessage(); h.sendMessage(msg); ... }); } } Interfaces de Usuario 25
  26. 26. Comunicación hebras Cola de Tareas <<Runnable>> <<Runnable>> Runnable r1 Runnable r2 <<Thread>> Hebra principal (UI) Handler hh.post(r1)h.postAtFrontOfQueue(r2) <<Thread>> <<Thread>> Hebra secundaria 1 Hebra secundaria 1 Interfaces de Usuario 26
  27. 27. Esquema 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 cosas h.post(r1); } } } Interfaces de Usuario 27
  28. 28. Más detalle Sólo el thread principal tiene un objeto Looper, a través del que accede a la cola de mensajes en un bucle Interfaces de Usuario 28
  29. 29. Ejemplo con mensajes● Vamos a hacer una aplicación que vaya mostrando el progreso de la tarea de fondo● Usaremos ProgressBar Interfaces de Usuario 29
  30. 30. Interfaz main.xml (I) Interfaces de Usuario 30
  31. 31. Interfaz main.xml (II) Interfaces de Usuario 31
  32. 32. Actividad (I) Interfaces de Usuario 32
  33. 33. Actividad (II) Interfaces de Usuario 33
  34. 34. Actividad (III) Interfaces de Usuario 34
  35. 35. Ejecución Interfaces de Usuario 35
  36. 36. Ejemplo paso de tareas Interfaces de Usuario 36
  37. 37. main.xml Interfaces de Usuario 37
  38. 38. Actividad (I) Interfaces de Usuario 38
  39. 39. Actividad (II) Interfaces de Usuario 39
  40. 40. Actividad (III) Interfaces de Usuario 40
  41. 41. Usando AsyncTask● Usar las hebras directamente es tedioso● Android proporciona AsyncTask – Permite crear una hebra de fondo que publica en la hebra UI sin tener que programar Threads o Handlers – Definimos una tarea asíncrona que se ejecuta de fondo y publica sus resultados en la hebra UI Interfaces de Usuario 41
  42. 42. AsyncTask – 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) Interfaces de Usuario 42
  43. 43. AsyncTask● Una AsyncTask tiene 3 tipos genéricos● AsyncTask<Params, Progress, Result> – Params – tipo de parámetros enviados a la tarea para su ejecución – Progress – tipo de las unidades de progreso publicadas durante su ejecución – Result – resultado de la ejecución de la tarea● Si no usamos un tipo, lo ponemos Void (con V) Interfaces de Usuario 43
  44. 44. Métodos de AsyncTask ● onPreExecute(): invocado por UIth justo tras ejecutar la tarea ● doInBackground(Params) – invocado por BGTh justo tras onPreExecute ● onProgressUpdate(Progress) – invocado por UITh tras una llamada de BGTh a publishProgress(Progress) ● onPostExecute(Result) invocado por UITh justo tras terminar BGTh Interfaces de Usuario 44
  45. 45. Ejemplo AsyncTask Interfaces de Usuario 45
  46. 46. Interfaz main.xml Interfaces de Usuario 46
  47. 47. Actividad MainTask Interfaces de Usuario 47
  48. 48. Actividad MainTask (II) … → número de argumentos variable, se procesa como un array Interfaces de Usuario 48
  49. 49. Actividad MainTask (III) Interfaces de Usuario 49
  50. 50. Yamba. StatusActivity2 (I) Interfaces de Usuario 50
  51. 51. StatusActivity2 (I) Interfaces de Usuario 51
  52. 52. Retoques finales● Ya tenemos la aplicación● Podemos – Añadir que descuente el número de caracteres – Añadir colores/imágenes Interfaces de Usuario 52
  53. 53. ContarCaracteres main.xml Interfaces de Usuario 53
  54. 54. ContarCaracteres - TextWatcher (I) Interfaces de Usuario 54
  55. 55. ContarCaracteres -TextChangedListener (III) Interfaces de Usuario 55
  56. 56. Personalización●En Android en res podemos hacer carpetas con recursos para – Una orientación res/layout-land/status.xml – Un idioma res/values-es-rES/strings.xml (language-region)●En eclipse new->XML File Interfaces de Usuario 56
  57. 57. Asistente recursos alternativos Interfaces de Usuario 57
  58. 58. Lo que llevamos hecho... Interfaces de Usuario 58
  59. 59. Resumen● En este tema hemos aprendido a gestionar concurrencia con tareas de fondo en Android● Hemos visto cómo gestionar directamente hebras, comunicarlas con Handlers, y cómo usar AsyncTasks● Por último, cómo darle un mejor aspecto visual y crear recursos alternativos Interfaces de Usuario 59
  60. 60. ¿Preguntas? Interfaces de Usuario 60

×