dúvida: notifyDestroyed e launch

Estou desenvolvendo uma aplicação em J2ME que por enquanto executa perfeitamente, desde de que seja a primeira vez que é Launch no emulador.
Se por algum motivo (clicar Exit por exemplo em uma de minhas Forms) a aplicação executar um notifyDestroyed e voltar a tela inicial do emulador e eu tentar executar de novo a aplicação, acontece um NullPointerException.

Minha dúvida é… o que acontece da segunda vez?
Quando acontece um notifyDestroyed a minha aplicação não “morre” no emulador?
E quando eu executo um Launch não há uma recriação de toda minha aplicação?

Já procurei em vários artigos sobre o ciclo de vida de MIDlet mas nao achei resposta para meu problema!

Não posto o código pois ele é muito grande.

Desde já agradeço!

[quote=maruero]Estou desenvolvendo uma aplicação em J2ME que por enquanto executa perfeitamente, desde de que seja a primeira vez que é Launch no emulador.
Se por algum motivo (clicar Exit por exemplo em uma de minhas Forms) a aplicação executar um notifyDestroyed e voltar a tela inicial do emulador e eu tentar executar de novo a aplicação, acontece um NullPointerException.

Minha dúvida é… o que acontece da segunda vez?
Quando acontece um notifyDestroyed a minha aplicação não “morre” no emulador?
E quando eu executo um Launch não há uma recriação de toda minha aplicação?

Já procurei em vários artigos sobre o ciclo de vida de MIDlet mas nao achei resposta para meu problema!

Não posto o código pois ele é muito grande.

Desde já agradeço![/quote]
Na verdade o notifyDestroyed() remove a sua aplicação da memória, e o único jeito de reiniciá-la é com uma nova instância (new SuaClasse() [extends MIDlet])… entendeu?

[quote=maruero]Estou desenvolvendo uma aplicação em J2ME que por enquanto executa perfeitamente, desde de que seja a primeira vez que é Launch no emulador.
Se por algum motivo (clicar Exit por exemplo em uma de minhas Forms) a aplicação executar um notifyDestroyed e voltar a tela inicial do emulador e eu tentar executar de novo a aplicação, acontece um NullPointerException.

Minha dúvida é… o que acontece da segunda vez?
Quando acontece um notifyDestroyed a minha aplicação não “morre” no emulador?

[/quote]
Morre sim

Com certeza !

E eu acho q o problema está na lógica no início do ciclo de vida da tua aplicação.É algo nela que está gerando a exception, não o WTK…

Boone eu tbm acho que deveria ser minha lógica de inicialização, porém a minha aplicação nunca apresentou o mesmo erro na primeira inicialização, portanto deve haver alguma diferença na re-inicialização para que esse problema ocorra!

ok Fox McCloud, mas o comando “launch” do emulador nao instancia minha aplicação de novo?
É o que eu espero que ele faça! Mas não está parecendo que está instanciando necessáriamente da mesma forma!

[quote=maruero]Boone eu tbm acho que deveria ser minha lógica de inicialização, porém a minha aplicação nunca apresentou o mesmo erro na primeira inicialização, portanto deve haver alguma diferença na re-inicialização para que esse problema ocorra!

ok Fox McCloud, mas o comando “launch” do emulador nao instancia minha aplicação de novo?
É o que eu espero que ele faça! Mas não está parecendo que está instanciando necessáriamente da mesma forma![/quote]
Dê uma olhada no código desse MIDlet de um jogo que eu fiz, pode ajudar a esclarecer alguma coisa…

[code]package controle;

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

/**

  • MIDlet, a classe principal que configura, inicia e termina o aplicativo

  • @author Cláudio Loureiro
    */
    public class Tetris extends MIDlet{

    private Engine engine;

    protected void destroyApp(boolean restart) throws MIDletStateChangeException {
    new Thread(new Runnable(){
    public void run() {
    engine.stop();
    }
    }).start();
    if(restart)startApp();
    else notifyDestroyed();
    }

    protected void pauseApp() {
    // TODO Auto-generated method stub
    }

    protected void startApp() throws MIDletStateChangeException {
    engine = new Engine(this);
    new Thread(engine).start();
    }

    public void finaliza() {
    try {
    destroyApp(false);
    } catch (MIDletStateChangeException e) {}
    }

    public void reinicia() {
    try {
    destroyApp(true);
    } catch (MIDletStateChangeException e) {}
    }

}[/code]
Não se preocupe com as Threads. Veja que quando eu chamo destroyApp(true), ou seja, restart = true, eu destruo a Thread do jogo e chamo startApp() novamente, reiniciando o programa, sem invocar notifyDestroyed(), então eu não mato a aplicação. Eu só invoco o notifyDestroyed() quando restart = false, que indica que a aplicação vai realmente fechar, sair da memória.