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:
[quote] 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. [/quote]
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!
Você vai precisar executar o processo em uma nova Thread e usar a thread corrente para mostrar o “aguarde”.
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
Rodrigo, por acaso voce pode colocar seu código?
Continuo apanhando… Vou colocar meu código aqui:
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…
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();
//...
Caramba… copiei esse esquema do J2ME Complete reference! :shock:
Vou tentar o seu método… Obrigado!
Ops, comi bronha… para que seu esquema funciona sim, mas criar um método chamado start() não é uma boa.
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!
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();
//...
[quote=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();
//...
[/quote]
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()).
Troque:
suaTela.show();
Por:
seuDisplay.setCurrent( suaTela );
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?