Como remover um objeto Runnable de um manipulador adicionado pelo PostDelayed?
-
26-09-2019 - |
Pergunta
eu tenho um "abrir" animação e estou usando Handler.postDelayed(Runnable, delay)
para acionar a "perto" animação após um breve atraso. No entanto, durante o tempo entre o Open and Close, há possivelmente outra animação desencadeada por um clique.
Minha pergunta é: como eu cancelaria o "perto" animação no manipulador?
Solução
Basta usar o removeCallbacks(Runnable r)
método.
Outras dicas
A resposta de Cristian está correta, mas, em oposição ao que é declarado nos comentários da resposta, você pode remover retornos de chamada para anônimos Runnables
ligando removeCallbacksAndMessages(null);
Como declarado aqui:
Remova quaisquer postagens pendentes de retornos de chamada e enviem mensagens cujo OBJ é token. Se o token for nulo, todos os retornos de chamada e mensagens serão removidos.
Esta é uma resposta tardia, mas aqui está um método diferente para quando você deseja remover apenas uma categoria específica de Runnables do manipulador (ou seja, no caso da OP, basta remover a animação fechada, deixando outros runnables na fila):
int firstToken = 5;
int secondToken = 6;
//r1 to r4 are all different instances or implementations of Runnable.
mHandler.postAtTime(r1, firstToken, 0);
mHandler.postAtTime(r2, firstToken, 0);
mHandler.postAtTime(r3, secondToken, 0);
mHandler.removeCallbacksAndMessages(firstToken);
mHandler.postAtTime(r4, firstToken, 0);
O código acima será executado "R3" e depois "R4" apenas. Isso permite remover uma categoria específica de runnables definida pelo seu token, sem precisar manter nenhuma referência aos próprios Runnables.
NOTA: O código -fonte compara tokens usando o operando "==" apenas (ele não chama .equals ()), portanto, é melhor usar o INTS/inteiros em vez de strings para o token.
Se você estiver usando a recursão, você pode conseguir isso passando "this". Veja o código abaixo.
public void countDown(final int c){
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
aq.id(R.id.timer).text((c-1)+"");
if(c <= 1){
aq.id(R.id.timer).gone();
mHandler.removeCallbacks(this);
}else{
countDown(c-1);
}
}
}, 1000);
}
Este exemplo definirá o texto de um TextView (timer) a cada segundo, contando o descendente. Quando chegar ao 0, ele removerá a View de Text da interface do usuário e desativará a contagem regressiva. Isso é útil apenas para alguém que está usando a recursão, mas cheguei aqui procurando por isso, por isso estou postando meus resultados.
Se você deseja remover o retorno de chamada para um runnable anônimo, basta executar:handler = null
Tudo será removido.