lunes, 9 de enero de 2012

5.6.1.- Programación Android - El ciclo de la vida -2 - LogCat

- no title specified
5.6.1.- Programación en Android:  El ciclo de la vida, segunda parte.

En anteriores capítulos hablamos de los diversos estados en los que puede estar una actividad en android, así como de los callbacks que los atienden.  En este capítulo implementaremos esas retrollamadas, utilizaremos el LogCat y la vista DDMS para ayudarnos en la depuración de nuestra aplicación.  Vamos a ver como cambian los estados en la práctica.


Implementar las callbacks

Seguimos con nuestra aplicación "Hola Mundo Android", y vamos a implementar las callbacks que "atiendan" a los diversos estados en los que se hallará nuestra aplicación, para ello, cogemos el eclipse y en el explorador de paquetes seleccionamos la activity que los implementará, pulsamos en ella con el botón derecho del ratón, y nos saldrá una ventana desplegable en la que seleccionaremos "Código Fuente", nos aparecerá otro menú desplegable, y en él escogemos "Alterar temporalmente/Implementar métodos".



Una vez hecho esto nos aparece una ventana como la siguiente:


Esta ventana sirve para implementar los métodos de manera automática, como nosotros vamos a seleccionar los callbacks de la actividad, elegimos arriba Activity, y le damos a la flecha para que nos muestre toda una serie de métodos que pueden ser implementados.  Más abajo, dónde pone "Punto de inserción", es dónde le podemos indicar que inserte el nuevo código, y si marcamos la casilla Generar comentarios de método, nos insertará unos comentarios por defecto.




Al abrir la lista de opciones de Activity, nos aparece una lista de métodos, y nosotros elegiremos o marcaremos los siguientes:  onDestroy(), onPause(), onRestart(), onResume(), onStart(), onStop(), onRestoresInstanceState(), onSaveInstanceState(), y el onCreate() si no lo tuvieramos ya (como ya lo tenemos no aparece en la lista).  Cuando hallamos realizado nuestra selección pulsamos en aceptar, y podemos observar como se ha añadido el código para atender dichos métodos o callbacks:


        @Override
        protected void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
}

        @Override
        protected void onPause() {
                // TODO Auto-generated method stub
                super.onPause();
}

        @Override
        protected void onRestart() {
                // TODO Auto-generated method stub
                super.onRestart();
}

        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onRestoreInstanceState(savedInstanceState);
}

        @Override
        protected void onResume() {
                // TODO Auto-generated method stub
                super.onResume();
}

        @Override
        protected void onSaveInstanceState(Bundle outState) {
                // TODO Auto-generated method stub
                super.onSaveInstanceState(outState);
}

        @Override
        protected void onStart() {
                // TODO Auto-generated method stub
                super.onStart();
}

        @Override
        protected void onStop() {
                // TODO Auto-generated method stub
                super.onStop();
}

Ahora vamos a proceder a añadir el código necesario para hacer un seguimiento de los estados por los que transita nuestra aplicación y para ello vamos a utilizar la clase log, procedemos a añadir la siguiente linea de código despues de la llamada a super.onDestroy(); y nos quedaría el código de la siguiente manera:


        @Override
        protected void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
                Log.d("HolaAndroidActivity", "Estamos en onDestroy()");
}
Vamos a comentarlo un poco.  El método Log, está en el paquete android.util.Log, y dependiendo de la configuración de eclipse, nos añadirá la importación de manera automática o no.  En caso de que no la añada tendremos un error en esa línea, pero si dejamos el ratón un momento sobre ella, nos aparecera una ventana en la que podemos indicarle que haga esa importación para así subsanar el error.  Al hacer esto nos pondrá la línea import android.util.Log;  cerca del principio del código.





Continuemos, nosotros hemos utilizado el método Log.d (debug), pero podíamos haber utilizado Log.i (mensajes de información), Log.e (mensajes de error), Log.w (warnings-avisos), Log.v (verbose), Log.wtf (mensajes que no deberían haber ocurrido – what a terrible failure – que seguro que pensabais que éra otra cosa ;)).  Después, el primer parámetro que le hemos puesto es una cadena de texto "HolaAndroidActivity", y es el parámetro TAG, o etiqueta, y nos sirve para etiquetar los mensajes que emitimos.  De momento sólo tenemos una actividad, pero en programas grandes, con muchas, si no las etiquetamos de forma adecuada no sabremos en que punto se encuentra nuestro programa ni de dónde ha salido ese mensaje.

Ahora repetimos nuestra acción con cada uno de los callbacks, recordando de cambiar el mensaje según el método en el que nos encontremos:


public class HolaAndroidActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("HolaAndroidActivity", "Estamos en onCreate()");
        setContentView(R.layout.main);
    }

        @Override
        protected void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
                Log.d("HolaAndroidActivity", "Estamos en onDestroy()");
}

        @Override
        protected void onPause() {
                // TODO Auto-generated method stub
                super.onPause();
                Log.d("HolaAndroidActivity", "Estamos en onPause()");
}

        @Override
        protected void onRestart() {
                // TODO Auto-generated method stub
                super.onRestart();
                Log.d("HolaAndroidActivity", "Estamos en onRestart()");
}

        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onRestoreInstanceState(savedInstanceState);
                Log.d("HolaAndroidActivity", "Estamos en onRestoreInstanceState()");
}

        @Override
        protected void onResume() {
                // TODO Auto-generated method stub
                super.onResume();
                Log.d("HolaAndroidActivity", "Estamos en onResume()");
}

        @Override
        protected void onSaveInstanceState(Bundle outState) {
                // TODO Auto-generated method stub
                super.onSaveInstanceState(outState);
                Log.d("HolaAndroidActivity", "Estamos en onSaveInstanceState()");
}

        @Override
        protected void onStart() {
                // TODO Auto-generated method stub
                super.onStart();
                Log.d("HolaAndroidActivity", "Estamos en onStart()");
}

        @Override
        protected void onStop() {
                // TODO Auto-generated method stub
                super.onStop();
                Log.d("HolaAndroidActivity", "Estamos en onStop()");
}
}

Cuando hallamos realizado esto, iniciamos el emulador y nos vamos a la vista DDMS, en la que observaremos algo similar a esto:


Podemos observar la salida de mensajes que ha dado nuestra activity, así como hacer un filtro de ellos, etc.   Si en la pestaña LogCat pulsamos en + podemos añadir un filtro, nos aparecerá una ventana similar a esta:




En la cual debemos indicar un nombre para el filtro, y la etiqueta que queremos filtrar.  Una vez realizado le damos a aceptar, y en la ventana de logcat, tendremos sólo las salidas de esta etiqueta, sin nada que nos interfiera.



Podemos utilizar el emulador e intentar realizar una llamada, para así ver el comportamiento de nuestra aplicación.
Y eso es todo, de momento...




Ver. 1.0 – Revisión 9.1.2012

No hay comentarios:

Publicar un comentario