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 Canvasthis.d.setCurrent(this.waitMsg);//dentro de connect faco todo o tratamento HTTPthis.connect();this.setNewScreen();...publicvoidsetNewScreen(){//aqui trato os dados recebidos e faco a nova telathis.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 :))
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
Jay_Santos
Rodrigo, por acaso voce pode colocar seu código?
Continuo apanhando… Vou colocar meu código aqui:
Classe de conexão:
classHttpSocketimplementsRunnable{...publicvoidstart(){Threadt=newThread(this);try{t.start();}catch(Exceptione){}}publicvoidrun(){//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
Jay_Santos
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
Jay_Santos
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:
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
Jay_Santos
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
Jay_Santos
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?