Desenvolvi um aplicativo para exibir algum texto em intervalos definidos na tela do emulador do Android. Eu estou usando a Handler
classe. Aqui está um trecho do meu código:
handler = new Handler();
Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
}
};
handler.postDelayed(r, 1000);
Quando executo esse aplicativo, o texto é exibido apenas uma vez. Por quê?
android
multithreading
Rajapandian
fonte
fonte
Respostas:
A correção simples para o seu exemplo é:
Ou podemos usar thread normal, por exemplo (com o Runner original):
Você pode considerar seu objeto executável apenas como um comando que pode ser enviado para a fila de mensagens para execução e o manipulador como apenas um objeto auxiliar usado para enviar esse comando.
Mais detalhes estão aqui http://developer.android.com/reference/android/os/Handler.html
fonte
fonte
Eu acho que pode melhorar a primeira solução do Alex2k8 para atualização correta a cada segundo
1. código original:
2.Análise
tv.append("Hello Word")
custo T milissegundos, depois que o tempo de exibição 500 vezes atrasado é 500 * T milissegundos3. Solução
Para evitar isso, basta alterar a ordem de postDelayed (), para evitar atrasos:
fonte
Para repetir tarefas, você pode usar
chame assim
Onde
tarefa sendo o método a ser executado
após o tempo de execução inicial
( intervalo do tempo para repetir a execução)
Em segundo lugar
E você também pode usar CountDownTimer se desejar executar um número de tarefas várias vezes.
E você também pode fazê-lo com executável. crie um método executável como
E chamá-lo de ambas as maneiras
OU
fonte
Eu acredito que neste caso típico, ou seja, executar algo com um intervalo fixo,
Timer
é mais apropriado. Aqui está um exemplo simples:O uso
Timer
tem poucas vantagens:schedule
argumentos da funçãomyTimer.cancel()
myTimer.cancel()
antes de agendar um novo (se myTimer não for nulo)fonte
fonte
r
que ainda está definida.Se eu entendi corretamente a documentação do método Handler.post ():
Portanto, os exemplos fornecidos pelo @ alex2k8, mesmo que estejam funcionando corretamente, não são os mesmos. Caso
Handler.post()
seja usado, nenhum novo encadeamento será criado . Você acabou de postarRunnable
no threadHandler
para ser executado pelo EDT . Depois disso, o EDT apenas executaRunnable.run()
, nada mais.Lembre-se:
Runnable != Thread
.fonte
Kotlin
Java
fonte
Um exemplo interessante é que você pode ver continuamente um contador / cronômetro em execução em thread separado. Também mostrando a localização do GPS. Enquanto a atividade principal, o thread da interface do usuário já estiver lá.
Excerto:
Para ver o código, veja aqui:
Exemplo de encadeamento que exibe a localização do GPS e a hora atual executáveis junto com o encadeamento da interface do usuário da atividade principal
fonte
agora no Kotlin você pode executar threads desta maneira:
fonte
Kotlin com corotinas
No Kotlin, usando corotinas, você pode fazer o seguinte:
Experimente aqui !
fonte