viernes, 27 de enero de 2012

6.3.Programacion Android - Añadiendo un registro LOG


6.3.- Programación en Android: Añadiendo un registro – Log

En este capítulo añadiremos un log a nuestra aplicación. Esto ya lo habíamos realizado anteriormente en otro capítulo, así que nos será fácil añadirlo.

Comenzaremos a darle forma a nuestra ActividadSplash, a la vez que iremos añadiendo unas modificaciones a la clase ActividadGlobal para ayudarnos posteriormente a hacer una depuración de nuestro programa.

Bien, comencemos modificando la clase ActividadGlobal. Vamos a añadirle un par de variables tipo String, una va a contener una cadena de texto (String) que será la etiqueta (TAG) que utilizaremos para dar los mensajes de depuración, y otra será para el archivo dónde guardaremos las preferencias del juego, además añadiremos una variable booleana, que tomará su valor de lo que hayamos indicado en el archivo androidmanifest.xml para la etiqueta "debuggable", así si cambiamos la etiqueta automáticamente nos cambiará esta variable.
Esto lo hacemos así ya que cuando enviemos los mensajes de log, lo haremos de forma condicional al valor de esta variable, con lo cual podemos añadir todos los mensajes que queramos, que cuando vayamos a publicar nuestra aplicación, simplemente cambiando la etiqueta debuggable ya no nos incorporará esos logs. Además tal como funciona java, al meter la salida del log dentro de un if, si el compilador de Java evalúa que eso va a ser siempre falso, entonces no lo incluye en el código. Es una forma de hacer la compilación condicional que hay en C++.
Estas son las variables que yo he creado:

// Etiqueta para archivo Log
protected static final String LOG_GLOBAL = "CorrectoIncorrecto";
protected static final String PREFERENCIAS_JUEGO = "correctoincorrecto.prefs";
protected static boolean VALOR_DEBUG;
//FIXME: En caso de publicar ponemos finalmente:
//protected static final boolean VALOR_DEBUG=false;

Nota: Esto nos va a servir de forma temporal, ya que para asegurarnos, en el caso final de publicar nuestra aplicación, en el código no cogeríamos este valor de lo que hay en el manifest, definiríamos la variable como final y le asignaríamos el valor false. Así nos aseguramos de que queda constante. También podemos utilizar un plug-in para eclipse ("antenna" o "eclipseme"), que permite utilizar las directivas del pre-procesador al estilo C. (java no tiene pre-procesador) y que sería la forma más adecuada de implementar el código condicional. (Esto necesitaría un capítulo en profundidad)

Y ahora implementaremos el método onCreate(), para ello recordamos que pulsamos sobre la clase con el botón derecho y en el menú contextual vamos a Código Fuente->Alterar temporalmente/Implementar métodos y ahí elegimos para Activity el método onCreate(); Cuando lo tengamos añadido, añadimos la siguiente línea de código, de forma que el método nos quede así:

protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/**
* FIXME
* Esto se podría sacar en la versión FINAL
*/
VALOR_DEBUG = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
}

En esta línea accedemos a las banderas (getApplicationInfo().flags) dónde están almacenados varios valores además del que buscamos, y realizamos un AND lógico con ApplicationInfo.FLAG_DEBUGGABLE que indica cuál es el bit que nos da el valor de debug (el bit 2). Recordamos que al hacer un AND, sólo nos devuelve uno en las posiciones en las que los dos valores tengan uno. En este caso hacemos una máscara con ApplicationInfo.FLAG_DEBUGGABLE que sólo tiene un bit activado. El valor que nos devuelve lo asignamos a VALOR_DEBUG, utilizando un "pequeño truco" para convertirlo en boolean (el 0!=), ya que las otras variables son ints.
Al hacer esto, nos aseguramos de que se inicializa la variable, ya que todas las demás actividades llaman al método super.onCreate(); con lo que llaman a éste ya que están derivadas de esta clase.
Esto que acabamos de hacer, lo podríamos haber implementado de otras múltiples formas, como un método static en la clase ActividadGlobal (al hacerlo static no hay que ejemplarizarlo para poder acceder a dicho método), y desde ese método dar la salida de debug, etc.
Bien, ahora cuando queramos añadir un mensaje al log, ponemos la siguiente línea de código, cambiando el mensaje claro:

if (VALOR_DEBUG == true) Log.v(LOG_GLOBAL, "En Actividad Splash");
// o simplemente:
if (VALOR_DEBUG) Log.v(LOG_GLOBAL, "En Actividad Splash");

Más adelante haré una ampliación de este capítulo, en la que explicaré como utilizar los plugins para permitir a Eclipse el pre-procesado y el compilado condicional.
Hacer constar, que aunque leyendo por muchos foros hay mucha gente que no le gusta el compilado condicional, pero es una herramienta que bien usada nos evita tener que mantener proyectos paralelos. Por ejemplo, en el caso de tener un programa que varíe según estemos registrados o no. Con el compilado condicional podríamos incluir en un mismo fichero el código para la versión registrada y otro para la versión "demo", y mediante la compilación condicional generar un ejecutable o otro.

Ver. 1.0 – Revisión 2.2.2012

No hay comentarios:

Publicar un comentario