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!.

Mar 22

Móviles, “the hard way”

Esta mañana, como todas las mañanas de día laborable, estaba desayunando en mi cafetería habitual antes de ir a trabajar. La camarera estaba hablando con uno de los clientes y comentaban el precio de un móvil que libre costaba unos 300€, pero si hacías contrato costaba unos 80€. Por supuesto, sería un móvil de estos güay que ahora, imagino que con Android o similar.

Mi móvil es un "patatófono", el de la foto, con java JME, con teclas y todo, de tarjeta prepago porque soy muy rácano y encima lo uso como hucha, ya que cada 6 meses le meto dinero para que no se caduque la tarjeta y como pasa el 99% del tiempo apagado, tampoco lo gasto.

Sin embargo, la conversación de la camarera me ha hecho pensar que todos estamos "pillados" por los móviles de última generación. Ella con su cliente de la forma habitual, pendiente de los "wasaps" mientras pone cafés, y yo, raro de mí, de la forma "dura". Justo mientras ella hablaba con el cliente, yo estaba desayunando y leyendo "Programming Android: Java Programming for the new generation of Mobile Devices".

Aprovecho para comentar que el libro no me está gustando demasiado. Voy aproximadamente por la página 150 de sus 550 y todavía está explicándome que eclipse tiene autocompletar. Hasta ahora va explicando las cosas metiéndose en detalles sueltos muy profundos, pero explicándolos por encima y sin dar un "esquema general". Por ejemplo, primero explica java en un capítulo, pero evidentemente muy por encima. Luego cuenta el SDK de Android con todas sus herramientas en otro capítulo, describe un montón de herramientas que vienen con el SDK, pero metiéndose en detalles sin explicarlos claramente. Luego se mete con detalles que considera importantes de la programación Android, como liarse a explicar programación concurrente, tema un poco "farragoso" para empezar por él, y nuevamente se mete en detalles sin explicarlos claramente.

Sigo leyendo, enganchado como estoy al "hard way" de los móviles.

Apr 06

Android: Varios botones que ejecutan el mismo OnClickListener

He empezado a jugar con Android y aparte de ir aprendiendo, aquí una primera "cosilla" que me ha llamado la atención.

Puede suceder que queramos que varios botones, al hacer click en ellos, ejecuten un mismo OnClickListener. Una forma de hacerlo desde código es, desde luego, crear e instanciar la clase OnClickListener e ir añadiéndola a todos los botones uno a uno.

MiOnClickLIstener miListener = new MiOnClickListener();
boton1.setOnClickListener(miListener);
boton2.setOnClickListener(miListener);

botonN.setOnClickListener(miListener);

 

Pero la forma que me ha llamado la atención es que se puede hacer esto mismo desde el fichero xml donde definimos nuestra Activity (ventana). Para ello, en el fichero xml de la Activity donde están los botones podemos poner

<Button android:onClick="pulsadoBoton" android:text="1" />
<Button android:onClick="pulsadoBoton" android:text="2" />

<Button android:onClick="pulsadoBoton" android:text="N" />

Y luego, en el código de nuestra Activity, sólo tenemos que definir un método pulsadoBoton(View v)

public class MiActivity extends Activity {
   public void onCreate(Bundle savedInstanceState) {
      …
   }

   public void pulsadoBoton(View v) {
      // Aquí lo que queramos que hagan los botones
   }
}

Y listo, esto debería funcionar. Creo que sólo vale para versiones más o menos nuevas de Android.