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?

Foi útil?

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 = nullTudo será removido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top