ti-enxame.com

Como remover um executável de um objeto manipulador adicionado por postDelayed?

Eu tenho uma animação "open" e estou usando Handler.postDelayed(Runnable, delay) para acionar uma animação "close" após um pequeno atraso. No entanto, durante o tempo entre abrir e fechar, é possível que haja outra animação acionada por um clique.

Minha pergunta é: como eu cancelaria a animação "close" no manipulador?

64
Bruce Lee

Basta usar o método removeCallbacks(Runnable r) .

91
Cristian

A resposta de Cristian está correta, mas, ao contrário do que é declarado nos comentários da resposta, você pode remover retornos de chamada para anônimos Runnables chamando removeCallbacksAndMessages(null);

Conforme indicado aqui :

Remova quaisquer postagens pendentes de retornos de chamada e mensagens enviadas cujo objetivo seja um token. Se o token for nulo, todos os retornos de chamada e mensagens serão removidos .

88
Daniel L.

Essa é uma resposta tardia, mas aqui está um método diferente para quando você deseja remover apenas uma categoria específica de executáveis ​​do manipulador (ou seja, no caso do OP, remova a animação fechada, deixando outras executáveis ​​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 executará "r3" e somente "r4". Isso permite remover uma categoria específica de executáveis ​​definida pelo seu token, sem a necessidade de manter nenhuma referência aos próprios executáveis.

Nota: o código-fonte compara os tokens usando apenas o operando "==" (não chama .equals ()); portanto, é melhor usar ints/Integers em vez de strings para o token.

16
NameSpace

Se você estiver usando recursão, poderá 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, em contagem decrescente. Quando chegar a 0, ele removerá o TextView da interface do usuário e desabilitará a contagem regressiva. Isso é útil apenas para alguém que está usando recursão, mas cheguei aqui procurando por isso, então estou postando meus resultados.

10
robisaks

Se você deseja remover o retorno de chamada de um Runnable anônimo, execute: handler = null Tudo será removido.

0
Karol Wasowski