second - postdelayed android studio
¿Cómo eliminar un ejecutable de un objeto controlador agregado por postDelayed? (4)
Tengo una animación "abierta" y estoy usando Handler.postDelayed(Runnable, delay)
para activar una animación "cerrada" después de un breve retraso. Sin embargo, durante el tiempo entre abrir y cerrar, posiblemente haya otra animación activada por un clic.
Mi pregunta es, ¿cómo cancelaría la animación "cerrar" en el controlador?
Esta es una respuesta tardía, pero este es un método diferente para cuando solo quiere eliminar una categoría específica de ejecutables del manejador (es decir, en el caso de OP, simplemente elimine la animación de cierre, dejando otros ejecutables 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 ejecutará "r3" y luego "r4" solamente. Esto le permite eliminar una categoría específica de ejecutables definida por su token, sin necesidad de mantener ninguna referencia a los ejecutables mismos.
Nota: el código fuente compara tokens usando el operando "==" solamente (no llama a .equals ()), así que es mejor usar ints / Integers en lugar de cadenas para el token.
La respuesta de Cristian es correcta, pero a diferencia de lo que se afirma en los comentarios de la respuesta, en realidad se pueden eliminar devoluciones de llamada para Runnables
anónimos llamando a removeCallbacksAndMessages(null);
Como se indica here :
Elimine las publicaciones pendientes de devoluciones de llamada y los mensajes enviados cuyo obj es token. Si token es nulo, se eliminarán todas las devoluciones de llamada y mensajes .
Si usa la recursión, puede lograr esto pasando "this". Vea el código a continuación.
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 ejemplo configurará el texto de un TextView (temporizador) cada segundo, contando hacia abajo. Una vez que llegue a 0, eliminará el TextView de la interfaz de usuario y desactivará la cuenta atrás. Esto solo es útil para alguien que usa recursividad, pero llegué aquí buscando eso, así que estoy publicando mis resultados.
Simplemente use el removeCallbacks(Runnable r)
.