GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Ampulheta animada durante processamento


#1

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:

//calcula novo frame
m_Canvas.repaint(); //m_Canvas foi inicializado antes da Timer.schedule

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


#2

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.


#3

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!


#4