Ampulheta animada durante processamento  XML
Índice dos Fóruns » Google Android e Java Micro Edition (ME)
Autor Mensagem
francieli
HelloWorld

Membro desde: 15/05/2008 07:20:06
Mensagens: 12
Offline

Olá!

Eu procurei pela resposta para esta dúvida pelo fórum, mas não encontrei. Mesmo assim, se for repetido, desculpa!

Eu tenho uma aplicação para celular que, algumas vezes, precisa fazer processamentos demorados. Assim, eu gostaria de mostrar uma espécie de ampulheta animada para o usuário enquanto esse processamento é feito. Essa ampulheta tem que aparecer "por cima" da tela do programa, não tapá-la completamente.

Eu tenho uma classe Canvas. O processamento ocorre quando uma certa tecla é acionada. Então, do método keyPressed, eu utilizo Timer.schedule() para desenhar frames da ampulheta a cada intervalo de tempo. Depois da Timer.schedule(), vem processamento, e depois vem Timer.cancel() para parar a ampulheta. Então eu chamo de novo repaint() para que a tela do programa seja redesenhada (com os efeitos do processamento).

Essa Timer.schedule() faz com que seja chamado, a cada intervalo de tempo, o método run() de uma classe TimerTask. Esse método contém, basicamente:


Só que essas chamadas repaint() só ocorrem depois do fim da KeyPressed. Em outras palavras, DEPOIS do processamento demorado, a ampulheta aparece rapidamente (no último frame) e já some.

Eu tentei colocar um m_Canvas.serviceRepaints() depois da repaint(), mas isso faz com que o timer pare de funcionar, ficando bloqueado nessa chamada até o fim da KeyPressed. O efeito agora é que a ampulheta aparece rapidamente no seu primeiro frame e depois some... e ainda DEPOIS do processamento demorado!

Se eu trocar simplesmente por um m_Canvas.paint(g), o método é chamado imediatamente, mas a ampulheta não é desenhada! Nesse caso, a ampulheta aparece em seu primeiro frame DEPOIS do processamento demorado, e não some até que eu faça outra coisa que envolva repaint().


Eu *acho* que a keyPressed pode estar bloqueando o repaint... mas eu não sei o porquê!

Alguém sabe como eu poderia fazer o que estou tentando?

Obrigada pela atenção!

Francieli
JavaES
Java Ninja
[Avatar]

Membro desde: 16/03/2008 22:34:12
Mensagens: 298
Localização: Vitória-ES
Offline

Tenta acionar a ampulheta com o keyPressed e as outras funções da classe com o keyReleased. Pois o keyPressed á disparado antes do keyRealised.

Alias, poste seu código aqui por inteiro, pois podem ser infinitos tipos de erro diferentes para este problema.

http://www.insidemobile.com.br/

Grandes homens fazem o impossível por que eles tentam o impossível.
francieli
HelloWorld

Membro desde: 15/05/2008 07:20:06
Mensagens: 12
Offline

Tinha postado a mesma dúvida no fórum da Nokia (em inglês).
O problema é que os eventos são serializados. Assim, enquanto o evento keyPressed não acaba, outro evento não pode ocorrer. O problema então tá na minha abordagem de efetuar coisas demoradas na keyPressed().
A solução que me sugeriram foi criar uma thread para realizar o processamento pesado e acabar o evento rápido pra ampulheta ser desenhada.

Essa vai ser uma solução "dolorosa" de implantar. É um código muuuuito grande, no qual a equipe trabalha há mto tempo, e agora tá próximo do lançamento... essa ampulheta teria que ser colocada em muitos pontos do programa, o que complica a utilização da solução multithread (e vai deixar o troço bem mais lento).

Vamos ter que pensar muito bem nessa questão ainda =P

Mas muito obrigada pela resposta!
 
Índice dos Fóruns » Google Android e Java Micro Edition (ME)
Ir para:   
Powered by JForum 2.1.8 © JForum Team