dúvida: notifyDestroyed e launch

4 respostas
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!

4 Respostas

Fox_McCloud

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!


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?

P

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?


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…

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!

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


Dê uma olhada no código desse MIDlet de um jogo que eu fiz, pode ajudar a esclarecer alguma coisa...

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) {}
	}

}
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.
Criado 8 de setembro de 2008
Ultima resposta 9 de set. de 2008
Respostas 4
Participantes 3