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