Estrutura J2ME

4 respostas
P

Olá…

Estou mechendo em J2ME, porém só consegui fazer um tipo de estrutura pra tratar os Command’s da vida…

Na minha classe principal (que herda de MIDLET) eu tenho as intancias de todas as “telas” da minha aplicacao… seja ela um form ou canvas como descrito abaixo:

public class LIBFIP extends MIDlet implements CommandListener {

private Display	display							= null;

private List	mainLista						= null;
private Form	formConsulta					= null;
private Form	formResultadoConsulta			= null;
private Form	formEmprestimo					= null;
private Form	formResultadoEmprestimo			= null;

private Ticker	tckMain							= null;
private Ticker	tckFormConsulta					= null;
private Ticker 	tckFormResultadoConsulta		= null;

private Command	cmdMainOk						= null;
private Command	cmdMainSair						= null;
private Command	cmdConsultaOk					= null;
private Command	cmdConsultaVoltar				= null;
private Command	cmdResultadoConsultaOk			= null;
private Command	cmdResultadoConsultaVoltar		= null;
private Command	cmdEmprestimoOk					= null;
private Command	cmdEmprestimoVoltar				= null;
private Command	cmdResultadoEmprestimoOk		= null;
private Command	cmdResultadoEmprestimoVoltar	= null;


}

O único padrão que eu estou usando na aplicacao é o SINGLETON, para evitar o uso de muita memória caso eu saia e volte pra tela (Uso eles nos forms e Canvas…)

E, dando continuade a minha questão, eu estou controlando TODOS os eventos da minha aplicação nessa minha classe dessa forma:

public void commandAction(Command c, Displayable d) {

	if (d == mainLista) {
		if (c == cmdMainOk || c == List.SELECT_COMMAND) {
			System.out.println("Principal -> " + MainList.opcoes[((List)d).getSelectedIndex()]);
			switch (((List)d).getSelectedIndex()) {
				case 0: {
					criaTelaMain();
					break;
				}


}

E, finalmente, a minha implementação do método criaTelaXXXXX() (Sao todas iguais o modo de implementacao)

public void criaTelaMain() {

if (this.mainLista == null) {

this.mainLista = MainList.getInstance();

this.cmdMainOk = new Command(OK, Command.OK, 0);

this.cmdMainSair = new Command(Sair, Command.BACK, 1);
this.mainLista.addCommand(cmdMainOk);
		this.mainLista.addCommand(cmdMainSair);
		this.mainLista.setCommandListener(this);
		this.tckMain = new Ticker(MainList.getDescricao());
		this.mainLista.setTicker(this.tckMain);
	}
	setDisplay(this.mainLista);

}

Gostaria que alguem esclarecesse em 3 coisas:

  • Sobre o meu uso de Singleton (em relacao a memória. se realmente está ocorrendo o que eu estou pensando…)
  • Se é dessa forma em que vcs trabalham pra tratar os Command’s
  • Só existe 1 classe que herda de Midlet ??? Eu nao posso chamar outro MIDLET pra outra “tela” minha ???

Eu estou desenvolvendo uma aplicacao J2ME MID 1.0 para o celular Nokia 3100.

Agradeço antecipadamente ajudas…

Atenciosamente, Pergentino.

4 Respostas

J

Buenas… vamos começar…

Vc vai ter uma MIDlet somente em seu programa… .e esta classe é que conterá a referencia para a tela (Display.getDisplay() )…

quanto a estruturação do programa, como somente uma classe herdará de MIDlet então vc referenciará ela nas outras, as quais somente implementarão CommandListener, pois eh interessante que cada classe cuide de seus próprios commands… e essas classes seriam cada tela… tome um pouco de cuidado com o excesso de OO em aplicativos J2ME, pois isso dispende consome bastante memoria e processamento!!

Bom, espero ter ajudado

Qqr coisa poste ai!

Abraço!

C

Olá,
Acho q o jujo eskeceu de frisar que vc deve passar classe principal que herda de MIDlet sempre por parametro no construtor das suas classes para poder acessar o recurso de mudançã de tela (setCurrent())
O ideal é vc criar uma classe pra cada tela, isso não não forem milhares de telas… hahahah… vc tem q analisar o que é viável pra sua aplicação.
Mas vc faria implements CommandListener em cada classe (tela), sendo que a referencia para a classe principal vc tem pelo fato de passar ela por parâmetro no construtor.

aí, por exemplo, vc faria:

classeprincipal.setCurrent(this.meuForm);

Seria algo assim, não precisa controlar tudo na MIDlet. Acho q controlar tudo na MIDlet fica muito bagunçado!

Mas é isso aí!!
Se vc se preocupa com uso de memória, o WTK tem um monitor de memória que ajuda vc reconhecer pontos de uso de memória excessívos.

Até mais!

P

mas, dessa forma aí, cada classe só pode ver a sua anterior e a próxima ???

E no caso dessa sequencia de tela:

Principal -> Opcoes -> Escolher personagem (por exemplo)

A sequencia de chamadas são:

na classe Principal: Opcoes opc = new Opcoes(this);

na classe Opcoes: TelaPersonagem tp = new TelaPersonagem(???) passo como parametro quem ? se for a Principal, como essa tela volta pra tela de opções se ela nem conhece ???

Como eu faria pra classe TelaPersonagem poder levar o usuario pra tela de opcoes ao pressionar o Command BACK ???

C

Olá,
Vc pode passar a tela anterior como parametro no construtor também, vc que v a necessidade! Mas não tem nada contra vc declarar todas no construtor, so cuidado ao intanciar todas, pode não ser interessante em relação à memória isso.

Até mais!

Criado 15 de novembro de 2004
Ultima resposta 15 de nov. de 2004
Respostas 4
Participantes 3