Quero fazer uma pausa entre duas linhas de código, deixe-me explicar um pouco:
-> o usuário clica em um botão (na verdade, um cartão) e eu o mostro alterando o plano de fundo desse botão:
thisbutton.setBackgroundResource(R.drawable.icon);
-> depois, digamos 1 segundo, preciso voltar ao estado anterior do botão, alterando novamente o plano de fundo:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> Tentei pausar o thread entre essas duas linhas de código com:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Entretanto, isso não funciona. Talvez seja o processo e não o segmento que eu preciso pausar?
Eu também tentei (mas não funciona):
new Reminder(5);
Com isso:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
Como posso pausar / adormecer o thread ou processo?
android
process
multithreading
Hubert
fonte
fonte
(!conditionCheck()) {}
geralmente é desencorajado.Respostas:
Uma solução para esse problema é usar o método Handler.postDelayed () . Alguns materiais de treinamento do Google sugerem a mesma solução.
No entanto, alguns apontaram que a solução acima causa um vazamento de memória porque usa uma classe interna e anônima não estática que contém implicitamente uma referência à sua classe externa, a atividade. Este é um problema quando o contexto da atividade é coletado como lixo.
Uma solução mais complexa que evita o vazamento de memória subclassifica as classes internas
Handler
eRunnable
estáticas dentro da atividade, pois as classes internas estáticas não possuem uma referência implícita à sua classe externa:Observe que ele
Runnable
usa um WeakReference para a atividade, necessário em uma classe estática que precisa de acesso à interface do usuário.fonte
final Button mynewbutton = mybutton;
e usarmynewbutton
no manipulador e no executável a partir daí.Você pode tentar este aqui é curto
AVISO : Nunca, nunca, faça isso em um thread da interface do usuário.
Use isso para dormir, por exemplo. segmento de plano de fundo.
A solução completa para o seu problema será: Esta está disponível API 1
Sem criar o manipulador tmp. Além disso, esta solução é melhor que o @tronman, porque não mantemos a visão do Handler. Também não temos problemas com o Handler criado em threads ruins;)
Documentação
Código para postDelayed da classe View:
fonte
OMG of course do this in background thread
é irrelevante, a menos que você mostre COMO colocá-lo no thread de segundo plano. Nesse momento, você descobrirá que tem uma resposta mais complicada do que a já aceita. Mencionei que uma solução melhor foi aceita há três anos? : PHandler + postRunnable
realiza tudo isso, em uma única etapa. Sem a sobrecarga do sistema para criar um segundo encadeamento.Eu uso isso:
fonte
e.getLocalizedMessage()
deve fazer?Handler/postDelayed
solução aceita possui duas vantagens: (1) evita a sobrecarga do sistema do 2º encadeamento, (1) é executado no encadeamento da interface do usuário, portanto, pode fazer alterações na interface do usuário sem causar uma exceção.Você provavelmente não quer fazer dessa maneira. Ao colocar um explícito
sleep()
no seu manipulador de eventos clicado no botão, você realmente trava a interface do usuário inteira por um segundo. Uma alternativa é usar algum tipo de timer de disparo único . Crie uma TimerTask para alterar a cor do plano de fundo para a cor padrão e agende-a no Timer.Outra possibilidade é usar um manipulador . Há um tutorial sobre alguém que deixou de usar um timer para usar um manipulador.
Aliás, você não pode pausar um processo. Um processo Java (ou Android) possui pelo menos 1 thread e você pode dormir somente com threads.
fonte
Eu uso CountDownTime
fonte
Foi o que fiz no final do dia - funciona bem agora:
fonte
Além das respostas do Sr. Yankowsky, você também pode usar
postDelayed()
. Está disponível em qualquerView
(por exemplo, seu cartão) e leva umRunnable
período de atraso. Ele executa oRunnable
depois desse atraso.fonte
Este é o meu exemplo
Crie um Java Utils
fonte
Ou você pode usar:
que tem a vantagem de não exigir uma embalagem
try ... catch
.fonte
Se você usa Kotlin e corotinas , pode simplesmente fazer
E se você precisar atualizar a interface do usuário
fonte
Sei que esse é um tópico antigo, mas na documentação do Android encontrei uma solução que funcionou muito bem para mim ...
https://developer.android.com/reference/android/os/CountDownTimer.html
Espero que isso ajude alguém ...
fonte
E para ter certeza de que você pode combiná-lo com o método "classe estática", conforme descrito na resposta do tronman
fonte