Desenhando um aviso de aguarde

12 respostas
J

Amigos,

meu aplicativo faz uma conexão HTTP que demora alguns segundos para retornar… Durante esse periodo, gostaria de mostrar uma imagem de “Aguarde” (como um pop-up) na tela.

Tentei alguns métodos (uns ortodoxos, outros nem tanto), mas nada deu certo, acho que o mais padrão que tentei foi criar uma classe nova que extendesse Canvas e chamei o Display.setCurrent antes de fazer a conexão, mais ou menos assim (pseudoCodigo :)).

//waitMsg = classe que extende Canvas
this.d.setCurrent(this.waitMsg);
//dentro de connect faco todo o tratamento HTTP
this.connect();
this.setNewScreen();
...

public void setNewScreen()
{
//aqui trato os dados recebidos e faco a nova tela
this.d.setCurrent(this.newScreen);
}

O que acontece é que ele vai direto para newScreen, sem mostrar o waitMsg.

Li na API que:

Calls to setCurrent() are not queued. A delayed request made by a setCurrent() call may be superseded by a subsequent call to setCurrent(). For example, if screen S1 is current, then

d.setCurrent(S2);
 d.setCurrent(S3);

may eventually result in S3 being made current, bypassing S2 entirely.

Como posso fazer para mostrar esse aviso? Não gostaria de usar Alert pq Alert ocupa a tela inteira, queria só fazer uma imagenzinha pequena mesmo (a não ser que de pra fazer resize no Alert :))

Obrigado pela ajuda!

12 Respostas

danieldestro

Você vai precisar executar o processo em uma nova Thread e usar a thread corrente para mostrar o “aguarde”.

rodrigo.achilles

Cara, que coincidência
Acabei de fazer uma. Eu fiz com o JWindow e Graphics, desenhando normal, e o mais importante como nosso amigo Daniel disse, usei com Thread, é perfeito pra esses casos.
Ok.

Abraços

J

Rodrigo, por acaso voce pode colocar seu código?

Continuo apanhando… Vou colocar meu código aqui:

  • Classe de conexão:
class HttpSocket implements Runnable
{
...
	public void start()
	{
		Thread t = new Thread(this);
		try
		{
			t.start();
		}
		catch(Exception e)
		{
		}
	}

	public void run()
	{
//o método connect cuida de toda a conexão. A parte de conexão está funcionando corretamente, o único problema eh realmente exibir a imagem.
		 this.connect();
	}

Eu uso o mesmo objeto de conexão em vários objetos, nao sei se isso chega a ser problema. Segue o código que uso para conexão. Estou fazendo um busy waiting simples so pra ver se consigo exibir a maldita image.

//this.wait é uma classe que extende Canvas e que eu estou usando para tentar exibir a imagem.
			this.mainClass.httpCon.setConnReturn(-100);
			this.mainClass.d.setCurrent(this.wait);
			this.mainClass.httpCon.start();
			while (this.mainClass.httpCon.getConnReturn() == -100)
			{
			}
			ret = this.mainClass.httpCon.getConnReturn();

A conexão funciona corretamente, mas nada de imagem…

danieldestro

Você tá fazendo tudo errado com a Thread.

É assim:

public class SuaClasse implements Runnable { public void run() { //faz o processo aqui } }

//... Thread t = new Thread( instanciaDeSuaClasse ); t.start(); //...

J

Caramba… copiei esse esquema do J2ME Complete reference! :shock:

Vou tentar o seu método… Obrigado!

danieldestro

Ops, comi bronha… para que seu esquema funciona sim, mas criar um método chamado start() não é uma boa.

J

Bom, de qualquer maneira, fiz do jeito que vc colocou e nada…

Comentando partes do meu código acho que percebi qual é o problema…

como mostrei no meu codigo, chamo o setCurrent na função que faz a conexão, quando eu termino a conexão, eu chamo uma função que faz o parse dos dados recebidos e chama novamente o setCurrent… algo assim:

void A()
{
this.d.setCurrent(aguarde);
//Conecta
this.parseData()
}

void parseData
{
//tratamento de dados.
this.d.setCurrent(novaTela);
}

Imagino que esse seja o problema? Alguém pode me dar alguma sugestão? Obrigado!

danieldestro

Mesmo assim acho que você não pegou o fio da meada. Você tem que fazer assim:

//... //inicia seu processo numa nova thread Thread t = new Thread() { public void run() { //seu processo aqui! //... //quando terminar o processo suaTela.dispose(); } }; t.start(); //exibe sua tela na thread atual //a thread corrent é a thread do swing suaTela.show(); //...

J

danieldestro:
Mesmo assim acho que você não pegou o fio da meada. Você tem que fazer assim:

//... //inicia seu processo numa nova thread Thread t = new Thread() { public void run() { //seu processo aqui! //... //quando terminar o processo suaTela.dispose(); } }; t.start(); //exibe sua tela na thread atual //a thread corrent é a thread do swing suaTela.show(); //...

Putz… Acho que agora quem está viajando sou eu :?

Esse seu suaTela é objeto de que classe? Eu estou tentando trabalhar com a classe Display direto (usando Display.setCurrent()).

danieldestro

Troque:

suaTela.show();

Por:

seuDisplay.setCurrent( suaTela );

J

Nada… coloquei o setCurrent logo depois do start e continua a mesma coisa… ELe nem chega a entrar no método paint da minha classe que extende canvas.

Daniel, reparei que no ultimo código você colocou o seguinte comentário:

Só pra constar, eu não uso o swing no meu aplicativo, isso é ruim?

danieldestro

O que você está usando?

Criado 27 de maio de 2005
Ultima resposta 30 de mai. de 2005
Respostas 12
Participantes 3