Jul 20

La leche, lo complicado que es programar en Android.

Hace ya unos meses que estoy leyendo un libro de programación en Android y haciendo algunas prácticas con mi tableta, bueno, más leyendo que haciendo prácticas, pero en ello ando. Y me llama la atención lo compleja que es la programación sobre Android.

No, el lenguaje java no es complejo, no más que cualquier otro lenguaje y menos para mí, que llevo años programando en java y no soy novato. Tampoco la API que ofrece Android es especialmente compleja. La documentación no es muy allá, hay partes de la API más claras y otras más oscuras, pero hay muchos ejemplos y tutoriales por internet, por lo que no hay demasiado problema en conseguir lo que quieres en un momento dado.

¿Cual es la complejidad entonces?

Android está pensado para móviles y tabletas, es decir, dispositivos escasos de recursos: poco procesador, poca memoria, poca batería y poco "disco duro" , por llamar de alguna forma a los pocos Gigas de almacenamiento interno que tiene, tarjeta micro SD aparte. Y como Android está especialmente pensado para sacar el máximo partido posible a esos pocos recursos, se siente con total libertad para quitar nuestro programa en ejecución de memoria en el momento que considere oportuno. Habitualmente, si el usuario está "jugando" con nuestro programa, no pasará eso, o sí. Pero si el usuario deja de atender la tableta un rato y entra en modo de ahorro de energía, si el usuario pone otra aplicación encima de la nuestra aunque sea momentáneamente o si símplemente, el usuario gira el dispositivo para que pase de vertical a apaisado o viceversa…. Android liquida nuestro programa de memoria y vuelve a cargarlo cuando lo considera necesario.

Pero como se espera que nuestro programa siga con lo que estaba haciendo cuando se vuelve a cargar en memoria, Android avisa a nuestro programa de que va a ser descargado de memoria, dándonos la oportunidad de salvar el estado del programa para que podamos restaurarlo luego. No quedaría bonito que el ususario esté con nuestro programa, se le ocurra momentánemente poner otra aplicación encima  y cuando vuelva a nuestro programa, haya perdido todo lo que estaba haciendo. Así que ante esos avisos de Android, debemos salvar todo lo que sea importante. Cuando nos vuelvan a llamar, Android nos pasará lo que habíamos salvado, y tenemos que restaurarlo. Si el usuario gira la pantalla, pasa lo mismo pero muy seguido, nos quitan de memoria dándonos oportunidad de salvar nuestros datos e inmediatamente después nos ponen en memoria para que recuperemos los datos… y podamos poner ventanas más acordes a la nueva orientación de pantalla. Y todo esto tiene como consecuencia, además de la pesadez de guardar y restaurar nuestro estado, que no nos podemos guardar en nuestras variables referencias a ventanas u otros objetos, ya que no sabemos en qué momento dejarán de estar disponibles.

El otro tema que complica la vida, también relacionado con la escasez de recursos, son las tareas que llevan tiempo. Android nos limita a unos pocos segundos ya que mientras nuestra tarea se realiza, la pantalla no responde. Si nuestra tarea no termna en unos pocos segundos, Android dará un aviso al usuario de si quiere abortar la tarea. Así que cualquier tarea que pueda tardar, como echar unas cuentas, consultar algo en internet, etc, debe hacerse en un hilo separado. Pero, aunque se puede, no es correcto hacer un hilo "vulgaris" de java,. ya que Android debe controlar también los hilos y debemos lanzarlos a través de API de Android. Así que debemos pedirle a Android que lance la tarea, debemos indicarle si esa tarea debe mantenerse aunque nuestra aplicación termine (un servicio), etc, etc y debemos indicarle a Android cómo avisar a nuestra aplicación cuando la tarea termine, para que muestre los resultados, siempre teniendo en cuenta que nuestra aplicación puede haberse ido de memoria y vuelto.

Total, que para programar cualquier cosa más allá de un "Hola Mundo" y hacerlo bien, es necesario hacer que nuestro programa tenga toda una "conversación" con Android y lo dicho, ¡la leche, lo complicado que es programar en Android!.

Entradas relacionadas:

3 Responses to “La leche, lo complicado que es programar en Android.”

  1. belano Says:

    amen!

  2. gorlok Says:

    Coincido en todo, pero son consideraciones que hay que tener debido a las restricciones y condiciones del ambiente, como dices. Cada ambiente tiene sus desafíos. Incluso en Swing, por poner un ejemplo, es mala práctica realizar cualquier tarea mínimamente compleja en el thread-ui, porque se freeza la ui degradando muchísimo la experiencia de usuario. O por ejemplo en una aplicación web multihilada: debemos tener consideraciones de dónde y cuándo guardamos el estado, para evitar corrupción de datos. Lo que sucede, es que con los ambientes que ya estamos acostumbrados, tenemos adquiridos una cantidad importante de buenos patrones y prácticas que aplicamos una y otra vez hasta de forma inconsciente. Con Android (o al cambiar a cualquier entorno distinto más bien), de golpe nos encontramos que debemos tomarle atención de nuevo a otros patrones: algunos nuevos, dejar de usar algunos viejos, y hasta modificar algunos conocidos. Estoy totalmente de acuerdo, pero luego de haber desarrollado en J2ME, Android me parece la gloria :D. J2ME si que era un ambiente limitadísimo, con mínimas ayudas para el desarrollador, con un camino lleno de “lomos de burro”, y tal vez por eso no lo veo tan intimidante a Android. Android puede ser frustante o intimidante al principio, pero en cuanto se le toma el ritmo, tiene sus recompensas.
    Pero ojo con una cosa: en Android se pueden hacer aplicaciones con requerimientos muy variados y distintos, y nunca se necesita usar todo en todas las aplicaciones. Así que no hay que asustarse por la cantidad impresionante de APIs y temas distintos que uno se encuentra al encarar el desarrollo de Android. Pero cuando se desarrolla algo en concreto, solo se usa un pequeño subconjunto de todo ello, nunca todas las APIs. Lo que se usa, dependerá del tipo de app. Luego, al ir haciendo experiencia, iremos incorporando el resto.

  3. Trellat Says:

    Más que difícil, yo creo que lo que pasa es que es muy distinto a lo que estamos acostumbrados. Quizá al ser Java esperamos que nos sea más sencillo por conocer el lenguaje… pero ahora además de eso hay que tener en cuenta muchas más cosas (tamaños de pantalla, densidades, recursos, idiomas,…) y hacerlo todo muy eficiente para que vaya todo fluido, que el usuario de movil o tableta tiene menos paciencia que el de sobremesa 🙂

Leave a Reply