Ejm de Funcionamiento de Un MIDlet

19
Ejemplo de Funcionamiento ciclo de vida de un MIDlet Para ilustrar el ciclo de vida un MIDlet y la forma en que se controla, a la vez que mostrar el funcionamiento de las herramientas de generación de MIDlets, vamos a considerar un ejemplo sencillo de MIDlet, caracterizado por: El MIDlet se llamará EjemploMIDlet1. El constructor imprime el valor de la propiedad color (ya veremos para qué se hace esto) y muestra un mensaje indicando que el midlet está construido y el valor de la propiedad. El método startApp() se encarga de mostrar un mensaje que permita trazar el ciclo de vida del MIDlet. A continuación se hace lo siguiente: o Si es la primera vez que se llama al método startApp(), entonces se crea un objeto auxiliar de la clase Tarea, que permite, en una hebra aparte, ejecutar una simple cuenta. Después de crear este objeto se invoca al método start() del mismo, de forma que empieze a desarrollarse la tarea indicada en el método run() de la misma. Finalmente se cambiará el valor de la variable booleana, de forma que la próxima vez que se llame al método startApp() se sepa que se trata de una llamada producida al salir de una pausa. o Si no es la primera vez que se llama al método startApp(), entonces se prosigue con la ejecución de la tarea realizada por la hebra, desde el punto en que se quedara parada previamente como consecuencia de la pausa. Cuando la tarea se finaliza, se fuerza la destrucción del MIDlet, mediante la llamada a destroyApp(true). El argumento true pasado a destroyApp indica que se

Transcript of Ejm de Funcionamiento de Un MIDlet

Page 1: Ejm de Funcionamiento de Un MIDlet

Ejemplo de Funcionamiento

ciclo de vida de un MIDlet

Para ilustrar el ciclo de vida un MIDlet y la forma en que se controla, a la vez que mostrar el funcionamiento de las herramientas de generación de MIDlets, vamos a considerar un ejemplo sencillo de MIDlet, caracterizado por:

El MIDlet se llamará EjemploMIDlet1. El constructor imprime el valor de la propiedad color (ya veremos para qué se hace esto) y muestra un mensaje indicando que el midlet está construido y el valor de la propiedad.

El método startApp() se encarga de mostrar un mensaje que permita trazar el ciclo de vida del MIDlet. A continuación se hace lo siguiente:

o Si es la primera vez que se llama al método startApp(), entonces se crea un objeto auxiliar de la clase Tarea, que permite, en una hebra aparte, ejecutar una simple cuenta. Después de crear este objeto se invoca al método start() del mismo, de forma que empieze a desarrollarse la tarea indicada en el método run() de la misma. Finalmente se cambiará el valor de la variable booleana, de forma que la próxima vez que se llame al método startApp() se sepa que se trata de una llamada producida al salir de una pausa.

o Si no es la primera vez que se llama al método startApp(), entonces se prosigue con la ejecución de la tarea realizada por la hebra, desde el punto en que se quedara parada previamente como consecuencia de la pausa. Cuando la tarea se finaliza, se fuerza la destrucción del MIDlet, mediante la llamada a destroyApp(true). El argumento true pasado a destroyApp indica que se busca liberar todos los recursos que el MIDlet pudiera estar usando.

El método pauseApp() se invoca al producirse una llamada telefónica, por ejemplo. Para forzar este evento hay una opción concreta del menú MIDlet de KToolbar. Al recibirse la llamada a este método, se muestra un mensaje para seguir la traza de funcionamiento. Se imprime el estado de trabajo de la tarea auxiliar (de la cuenta) y se fuerza a que la hebra deje de trabajar. Este es el objetivo de la llamada tarea.interrumpir().

Como no se sabe aún lo suficiente como para construir interfaces de usuario (aunque pronto se sabrá), todos los mensajes se enviarán a la salida estándar. Se incluye a continuación el código correspondiente, y seguidamente se verá cómo generar el suite, tanto de forma manual como automática.

Page 2: Ejm de Funcionamiento de Un MIDlet

import javax.microedition.midlet.MIDlet;import javax.microedition.midlet.MIDletStateChangeException;

public class EjemploMIDlet1 extends MIDlet{ Tarea tarea; boolean primeraVez;

// Constructor por defecto de la clase public EjemploMIDlet1(){ String color=getAppProperty("color"); System.out.println("\n\n\nConstruido MIDlet con color: "+color); primeraVez=true; }

// Metodo para iniciar el funcionamiento del MIDlet public void startApp() throws MIDletStateChangeException{ System.out.println("Metodo startApp");

if (primeraVez == true){ System.out.println("Ejecucion la primera vez.......");

System.out.println("Se inicia cuenta larga para permitir pausar"); tarea=new Tarea(); tarea.start(); primeraVez=false; } else{ // Se reanuda la ejecucion tras salir de la pausa System.out.println("Llamada tras pausa..... Valor de i: "+tarea.getI()); tarea.continuar();

// Se destruye el midlet cuando la tarea termine if (tarea.getFinalizado() == true){ destroyApp(true); } } }

// Metodo para detener el funcionamiento del MIDlet public void pauseApp(){ System.out.println("Metodo pauseApp"); System.out.println("Valor de i en el momento de la pausa: "+tarea.getI()); tarea.interrumpir(); }

// Metodo para destruir el MIDlet public void destroyApp(boolean condition){ System.out.println("Metodo destroyApp. Condicion: "+condition); if (condition == true){ // Se indica la finalizacion del midlet notifyDestroyed(); } }}

class Tarea extends Thread{ int i; boolean interrumpido;

Page 3: Ejm de Funcionamiento de Un MIDlet

boolean finalizado;

Tarea(){ i=0; interrumpido=false; finalizado=false; }

public void run(){ for(; i < 9000000; ){ if (interrumpido == false){ i++; } else{ try{ sleep(100); } catch(InterruptedException e){ System.out.println("Problema al dormir hebra...."); } } //System.out.println("Valor de i: "+i); }

// Se finaliza la tarea finalizado=true; }

// Metodo para obtener el valor de i int getI(){ return i; }

// Metodo para interrumpir void interrumpir(){ interrumpido=true; }

// Metodo para continuar void continuar(){ interrumpido=false; }

// Metodo para acceder al valor de finalizado boolean getFinalizado(){ return finalizado; }}

El código completo de este MIDlet puede descargarse directamente desde aquí:

EjemploMIDlet1.java Se trata de un MIDlet muy sencillo, que permitirá practicar con los procedimientos de generación de MIDlets, así como los posibles estados en que puede encontrarse un MIDlet en ejecución: pausa, activo y destruido.

Uso de KToolbar

Seguiremos el proceso completo de trabajo sobre el MIDlet incluido anteriormente. El primer paso consistirá en ejecutar la herramienta KToolbar. Esta aplicación se encuentra

Page 4: Ejm de Funcionamiento de Un MIDlet

en la instalación de Wireless Toolkit. Para ejecutarla haremos lo siguiente (si no funciona, avisad al profesor.......).

ktoolbar

La ventana principal de KToolbar tiene la siguiente aparencia:

Crearemos un proyecto de suite, en el que incluiremos el MIDlet generado con anterioridad. Para ello se pulsa en el botón New Project. Al pulsar sobre él aparecerá la siguiente ventana:

Como se ve, hemos rellenado la información de ambos campos de texto. Como nombre del proyecto podemos elegir cualquiera, sin necesidad de coincidir con el nombre de la clase principal del MIDlet. En el segundo campo de texto hemos de especificar el nombre de la clase principal del suite que queremos ejecutar en el emulador. En este caso es EjemploMIDlet1. En cuanto se pulsa el botón Create Project aparecerá una nueva ventana donde aparecen informaciones relativas al MIDlet.

Page 5: Ejm de Funcionamiento de Un MIDlet

Al mismo tiempo, en la ventana principal de KToolbar han aparecido varios mensajes:

Page 6: Ejm de Funcionamiento de Un MIDlet

Estos mensajes indican que se ha creado la estructura de directorios necesaria para el proyecto, y que las clases que queramos formen parte del MIDleet habrá que ubicarlas en el directorio src; recursos adicionales (como iconos) irán en el directorio res y las librerías (si las hubiera) en el directorio lib. Como se ve, el directorio del proyecto se crea en el directorio de instalación de la herramienta, bajo el subdirectorio apps. En nuestro caso, la ruta completa será $HOME/java/WTK2.2/apps/ejemplo1. Nuestro primer MIDlet usará un icono muy sencillo (descargadlo aquí: iconoPeq.png).

Por tanto, lo primero que haremos será copiar el archivo con la clase asociada al MIDlet en el directorio $HOME/java/WTK2.2/apps/ejemplo1/src/. El icono se ubicará en el directorio $HOME/java/WTK2.2/apps/ejemplo1/res/. Dentro de este directorio crearemos a su vez el directorio icons. Y en él será donde se guarde el archivo png del icono. Para indicar que el icono del MIDlet es este, debe modificarse la información sobre el icono. Para ello se pulsa el botón Settings de KToolbar. Aparecerá la venta siguiente:

Aprovechamos ahora para indicar que deseamos que el MIDlet sea conforme a MIDP1.0. Para ello se selecciona esta opción de las disponibles al pulsar sobre Target

Page 7: Ejm de Funcionamiento de Un MIDlet

Platform. Para indicar el icono asociado, se selecciona la pestaña MIDlets. Una vez hecho esto aparecerá

Para poder cambiar el icono (el valor presente en la figura anterior se introduce por defecto), basta con seleccionar la línea con los datos (la fila que aparece rellena), con lo que se marcará con un color diferente para indicarnos que está seleccionada:

Page 8: Ejm de Funcionamiento de Un MIDlet

Ahora basta con pulsar sobre el botón Edit, lo que dará lugar a la aparición de la ventana de edición:

Sobre esta ventana, en el recuadro Icon escribiremos /icons/iconoPeq.png, tal y como se aprecia a continuación:

Page 9: Ejm de Funcionamiento de Un MIDlet

Al finalizar se pulsa sobre el botón Aceptar de la ventana de edición. Con esto queda registrado el cambio de la propiedad correspondiente al icono del MIDlet:

Y pulsando sobre el botón OK desaparece la ventana de propiedades. Esto es todo lo necesario para poder generar y ejecutar el MIDlet. En primer lugar, procedemos a generar las clases a partir del código fuente. Para ello se pulsa el botón Build. Si todo ha ido bien, aparecerá un mensaje indicado que la generación se realizó de forma correcta. En caso de haber errores, se mostrarán en la ventana principal de KToolbar.

Page 10: Ejm de Funcionamiento de Un MIDlet

En cuanto se ha generado el MIDlet, podemos ejecutar mediante el botón Run. Al pulsarlo, aparecerá el emulador con el MIDlet listo para ejecución.

Page 11: Ejm de Funcionamiento de Un MIDlet

Para lanzar la ejecución del MIDlet se pulsa sobre la tecla bajo el mensaje Launch. En cuanto se produce esto el MIDlet se crea y el dispositivo invoca al método startApp(). Esto explica los mensajes que se aprecian en la consola de KToolbar:

Page 12: Ejm de Funcionamiento de Un MIDlet

Se muestra el mensaje de traza puesto en el constructor, indicando que la propiedad color no está definida. Arreglar esto se deja para más adelante. También se aprecia la traza ubicada a la entrada del método startApp(), que ha sido invocado por el sistema de gestión de ejecución de MIDlets del dispositivo móvil. Los dos mensajes que aparecen a continuación son trazas que muestran que el MIDlet se ejecuta por primera vez.

Para pausar el MIDlet, tras unos segundos de funcionamiento, basta con actuar sobre el menú MIDlet del emulador telefónico y seleccionar la opción Pause. Al hacerlo el emulador queda de la forma siguiente:

Page 13: Ejm de Funcionamiento de Un MIDlet

A su vez, en la consola de KToolbar veremos los siguientes mensajes:

Page 14: Ejm de Funcionamiento de Un MIDlet

Las nuevas líneas de traza indican que se ha invocado al método pauseApp(). Como comentamos previamente, esto ocurrirá al producirse una llamada de teléfono sobre el móvil, por ejemplo. Se observa el valor de la cuenta en el momento en que se produjo la pausa. Para continuar ejecutando el MIDlet (lo que ocurriría al finalizar la llamada), forzamos la salida del modo de pausa. Para ello volvemos a actuar sobre el menú MIDlet, seleccionado la opción Resume. Esto hace que aparezcan nuevas líneas de traza indicando que se ha producido una nueva llamada al método startApp(), pero sin tratarse de la primera llamada al mismo.

Por su parte, del emulador desaparece la indicación de llamada entrante:

Page 15: Ejm de Funcionamiento de Un MIDlet

Si se observa el código del método startApp(), se aprecia que la destrucción del MIDlet sólo se producirá en el caso en que ya haya finalizado la tarea de cuenta. Para asegurarnos que esto ocurre, tras la salida del modo de pausa esperaremos unos segundos, se genera una nueva pausa (pulsando, como se indicón previamente, sobre la opción Pause del menú MIDlet) para, a continuación forzar, mediante Resume (en el menú MIDlet), una nueva llamada a startApp() una vez finalizada la cuenta. Cuando esto ocurra, tendremos:

Page 16: Ejm de Funcionamiento de Un MIDlet

Sólo cuando el MIDlet haya sido destruido de forma completa podrá volver a lanzarse de forma correcta.