Pregunta

Tengo un animación "abierto" y estoy usando Handler.postDelayed(Runnable, delay) para desencadenar una "cierre" la animación después de un breve retraso. Sin embargo, durante el tiempo entre la apertura y cierre, posiblemente hay otra animación provocado por un clic.

Mi pregunta es, ¿cómo iba a cancelar la "cierre" la animación en el controlador?

¿Fue útil?

Solución

Sólo tiene que utilizar la removeCallbacks(Runnable r) método.

Otros consejos

La respuesta de Cristian es correcto, pero a diferencia de lo que se afirma en los comentarios de la respuesta, en realidad se puede quitar devoluciones de llamada para Runnables anónima llamando removeCallbacksAndMessages(null);

:

  

Eliminar cualquier mensajes pendientes de devoluciones de llamada y mensajes enviados cuyo obj es simbólica. Si contador es nulo, se eliminarán todas las devoluciones de llamada y mensajes .

Esta es una respuesta tardía, pero aquí hay un método diferente para cuando sólo se desea eliminar una categoría específica de runnables desde el controlador (es decir, en el caso de OP, basta con retirar el cierre de animación, dejando otros runnables en la cola):

    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);

El código anterior se ejecutará "R3" y luego "R4" solamente. Esto le permite eliminar una categoría específica de runnables definidos por su ficha, sin necesidad de realizar ninguna referencia a los propios runnables.

Nota: el código fuente compara fichas utilizando los "==" operando solamente (no llama .equals ()), así que es mejor usar enteros / Números enteros en lugar de cadenas para la ficha.

Si su uso de la recursividad, se puede lograr esto haciendo pasar "este". Ver código de abajo.

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);
}

En este ejemplo se va a establecer el texto de un TextView (temporizador) cada segundo, la cuenta atrás. Una vez que llegue a 0, se eliminará el del TextView desde la interfaz de usuario y desactivar la cuenta atrás. Esto sólo es útil para alguien que está utilizando la recursividad, pero llegó aquí en busca de eso, así que les dejo mis resultados.

Si desea eliminar la devolución de llamada para un Ejecutable anónima basta con ejecutar: handler = null Todo va a ser eliminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top