Quero poder chamar o método a seguir após um atraso especificado. No objetivo c, havia algo como:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Existe um equivalente desse método no android com java? Por exemplo, eu preciso poder chamar um método após 5 segundos.
public void DoSomething()
{
//do something here
}
removeCallbacks(Runnable r)
oHandler
.import android.os.handler
Eu não poderia usar nenhuma das outras respostas no meu caso. Eu usei o java Timer nativo.
fonte
Nota: Essa resposta foi dada quando a pergunta não especificou o Android como contexto. Para obter uma resposta específica ao segmento da interface do usuário do Android, consulte aqui.
Parece que a API do Mac OS permite que o encadeamento atual continue e agende a execução da tarefa de forma assíncrona. No Java, a função equivalente é fornecida pelo
java.util.concurrent
pacote. Não sei ao certo quais limitações o Android pode impor.fonte
ScheduledFuture<?>
retornado porworker.schedule()
e chame seucancel(boolean)
método.ScheduledExecutorService
.Para executar algo no thread da interface do usuário após 5 segundos:
fonte
você pode usar o Handler dentro do UIThread:
fonte
Obrigado por todas as ótimas respostas, encontrei uma solução que melhor se adapta às minhas necessidades.
fonte
1. Usando
Handler
2. Usando o TimerTask
Ou ainda mais curto
Ou o menor seria
3. Usando
Executors
1. Usando
Handler
2. Usando
Timer
3. Usando
ScheduledExecutorService
fonte
How to call a method after a delay in Android
. Então, eu me concentrei nisso. Ao ponto. Caso contrário, o vazamento de java é um grande tópico a ser entendido separadamente pelos desenvolvedores.Veja esta demonstração:
fonte
Se você precisar usar o manipulador, mas estiver em outro thread, poderá usá-lo
runonuithread
para executar o manipulador no thread da interface do usuário. Isso o salvará das exceções lançadas pedindo para ligarLooper.Prepare()
Parece bastante confuso, mas esse é um dos caminhos.
fonte
Eu prefiro usar o
View.postDelayed()
método, código simples abaixo:fonte
Aqui está a minha solução mais curta:
fonte
fonte
Se você estiver usando o Android Studio 3.0 e superior, poderá usar expressões lambda. O método
callMyMethod()
é chamado após 2 segundos:Caso você precise cancelar a execução atrasada, use o seguinte:
fonte
Sugiro o Timer , que permite agendar um método a ser chamado em um intervalo muito específico. Isso não bloqueará sua interface do usuário e manterá seu aplicativo sensível enquanto o método estiver sendo executado.
A outra opção é a wait (); método, isso bloqueará o encadeamento atual pelo período especificado. Isso fará com que sua interface do usuário pare de responder se você fizer isso no thread da interface do usuário.
fonte
Para um atraso de manipulação de linha simples, você pode fazer o seguinte:
Eu espero que isso ajude
fonte
Você pode usar isso para a solução mais simples:
Senão, Abaixo pode ser outra solução útil limpa:
fonte
Você pode torná-lo muito mais limpo usando as expressões lambda recém-introduzidas:
fonte
Portanto, existem algumas coisas a considerar aqui, pois existem muitas maneiras de esfolar esse gato. Embora todas as respostas já tenham sido dadas, foram selecionadas e escolhidas. Eu acho que é importante que isso seja revisado com diretrizes de codificação adequadas para evitar que alguém vá na direção errada apenas por causa da "resposta simples selecionada pela maioria".
Então, primeiro vamos discutir a resposta simples pós-adiada que é a resposta selecionada pelo vencedor em geral neste tópico.
Algumas coisas a considerar. Após o atraso da postagem, você poderá encontrar vazamentos de memória, objetos mortos, ciclos de vida que desapareceram e muito mais. Portanto, lidar com isso corretamente também é importante. Você pode fazer isso de duas maneiras.
Por uma questão de desenvolvimento moderno, fornecerei em KOTLIN
Aqui está um exemplo simples de como usar o encadeamento da interface do usuário em um retorno de chamada e confirmar que sua atividade ainda está ativa e bem quando você pressiona seu retorno de chamada.
No entanto, isso ainda não é perfeito, pois não há motivo para acessar sua chamada de retorno se a atividade desaparecer. portanto, uma maneira melhor seria manter uma referência a ele e remover seus retornos de chamada assim.
e, é claro, lida com a limpeza na onPause, para que não atinja o retorno de chamada.
Agora que falamos do óbvio, vamos falar sobre uma opção mais limpa com as corotinas dos dias modernos e o kotlin :). Se você ainda não os está usando, está realmente perdendo.
ou se você quiser sempre executar uma interface do usuário nesse método, basta:
É claro que, assim como o PostDelayed, você deve garantir o cancelamento, para que você possa realizar as verificações de atividade após a chamada de atraso ou cancelá-la na onPause, como na outra rota.
// manipular limpeza
Se você colocar a inicialização (UI) na assinatura do método, o trabalho poderá ser atribuído na linha de código de chamada.
para que a moral da história seja segura com suas ações atrasadas, remova seus retornos de chamada ou cancele seus trabalhos e, é claro, confirme que você tem o ciclo de vida certo para tocar nos itens em seu retorno de retorno atrasado. As Coroutines também oferecem ações canceláveis.
Também é importante notar que você geralmente deve lidar com as várias exceções que podem surgir com as corotinas. Por exemplo, um cancelamento, uma exceção, um tempo limite, o que você decidir usar. Aqui está um exemplo mais avançado, se você decidir realmente começar a utilizar corotinas.
fonte
Eu criei um método mais simples para chamar isso.
Para usá-lo, basta ligar para:
.CallWithDelay(5000, this, "DoSomething");
fonte
performSelector
. esta é a melhor maneira de fazer.Abaixo de um funciona quando você obtém,
fonte
Usando o Kotlin, podemos conseguir fazendo o seguinte
fonte
É muito fácil usar o
CountDownTimer
. Para mais detalhes https://developer.android.com/reference/android/os/CountDownTimer.htmlfonte
Se você usa o RxAndroid, o tratamento de threads e erros fica muito mais fácil. O código a seguir é executado após um atraso
fonte
todo mundo parece esquecer de limpar o manipulador antes de postar uma nova mensagem ou executável. Caso contrário, eles poderiam se acumular e causar um mau comportamento.
fonte
Aqui está outra maneira complicada: não lançará exceção quando os elementos da interface do usuário executáveis mudarem.
Você pode chamar a animação assim:
A animação pode ser anexada a qualquer visualização.
fonte
Aqui está a resposta em Kotlin, pessoas preguiçosas, preguiçosas:
fonte
Eu gosto de coisas mais limpas: aqui está minha implementação, código embutido para usar dentro do seu método
fonte
Uma solução adequada no android:
fonte
Solução semelhante, mas muito mais limpa de usar
Escreva esta função fora da classe
Uso:
fonte
do
é um método embutido por isso temos de usar `usá-lo como nome de variáveldo
depois de um atraso de 3 segundosNo Android, podemos escrever abaixo do código kotlin para atrasar a execução de qualquer função
fonte