Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo quitar un runnable de un objeto manejador añadido por postDelayed?

Tengo una animación "abierta" y estoy usando Handler.postDelayed(Runnable, delay) para activar una animación "close" después de un breve retraso. Sin embargo, durante el tiempo entre abrir y cerrar, es posible que otra animación desencadenada por un clic.

Mi pregunta es, ¿cómo puedo cancelar la animación "close" en el controlador?

  • Bandas de colores únicamente en Android 4.0+
  • En Android, compruebe si la base de datos sqlite existe falla de vez en cuando
  • Android studio 0.4.2: Error de sincronización de proyecto de Gradle
  • Error: Error en la ejecución de la tarea ': app: clean'. No se puede eliminar el archivo
  • Dependencias proporcionadas sólo pueden ser frascos
  • Cómo dibujar una superposición en un SurfaceView utilizado por la cámara en Android?
  • ¿Soporta la plataforma Android SpatiaLite?
  • YotubePlayerSupportFragment vista de pantalla completa en modo horizontal
  • OpenGL ES tutorial para android no parece funcionar
  • Android Layout hace que todos los niños no se puedan hacer clic
  • Se reciben varias notificaciones de GCM
  • Adición de una vista a un LinearLayout en una posición especificada
  • 4 Solutions collect form web for “Cómo quitar un runnable de un objeto manejador añadido por postDelayed?”

    Simplemente utilice el removeCallbacks(Runnable r) .

    La respuesta de Cristian es correcta, pero en contraposición a lo que se dice en los comentarios de la respuesta, en realidad puede eliminar las devoluciones de llamada para Runnables anónimos llamando a removeCallbacksAndMessages(null);

    Como se indica aquí :

    Elimine todos los mensajes pendientes de devoluciones de llamada y mensajes enviados cuyo obj es token. Si token es nulo, se eliminarán todos los callbacks y mensajes .

    Si está usando la recursión, puede lograr esto pasando "esto". Vea el código 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); } 

    Este ejemplo establecerá 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 regresiva. Esto sólo es útil para alguien que está usando la recursión, pero he llegado aquí buscando eso, así que estoy publicando mis resultados.

    Esta es una respuesta tardía, pero aquí hay un método diferente para cuando sólo desea eliminar una categoría específica de runnables del manejador (es decir, en el caso de OP, simplemente quite 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 runnables definidos por su token, sin necesidad de mantener ninguna referencia a los propios runnables.

    Nota: el código fuente compara los tokens usando el operando "==" solamente (no llama .equals ()), así que mejor usar ints / Integers en lugar de strings para el token.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.