Handler.postdelayed

Estoy usando el método handler.postDelayed para crear un retraso para algunas cosas de animación.

Con eso, también estoy reproduciendo una canción usando Mediaplayer. El usuario puede salir de esta clase de acción haciendo clic en siguiente. Pero en la siguiente pantalla, la misma canción continúa a pesar de que llamé al método stop en el onclicklistener del siguiente botón.

¿Se debe al retraso de tiempo que se agrega que se ejecuta después de que se carga la siguiente actividad? ¿Alguna idea?

handler.postDelayed(new Runnable() {
        public void run() {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.num2);
            mp.start();
            imageView1.setImageResource(R.drawable.countcat2);
        }
    }, 2000);

preguntado el 16 de mayo de 11 a las 18:05

2 Respuestas

¿Agregaste un Log para ver si run() se llama? Asumiría que su controlador no está registrado; después de todo, postDelayed esperará hasta que la lanzadera se active de nuevo.

Supongo que su animación es más rápida que esos 2000ms. No podrá hacer que se llame a su controlador de todos modos después de que su actividad haya desaparecido, está accediendo imageView1 que supongo que se destruye en onDestroy.

Podría considerar agregar una bandera que obligue a que la operación se llame inmediatamente en onDestroy, y / o podrías usar un Timer. En el caso del temporizador, asegúrese de no utilizar algo como imageView1 después de que haya sido destruido.

contestado el 16 de mayo de 11 a las 22:05

doh! bandera era tan simple. Estoy avergonzado. Gracias :) - nasaa

Usa hilos. Y luego deténgalo con una interrupción:

Public Thread getThread(final Handler handle, int delay)
{
  return new Thread() 
  {
    @Override
    public void run() 
    {
      try
      {
         synchronized(this) 
         {
           Thread.sleep(delay);     
           handle.post(new Runnable() 
           {    
             @Override
             public void run() 
             {      
               "the code to be exec."
             }
           });

         }    
     }
       catch(Exception e)
       {
    e.printStackTrace();
       }
    };
  };
}

O puede usar la función postDelayed

Public Thread getThread(final Handler handle, int delay)
{
  return new Thread() 
  {
    @Override
    public void run() 
    {
      try
      {
         synchronized(this) 
         {  
           handle.postDelayed(new Runnable() 
           {    
             @Override
             public void run() 
             {      
               "the code to be exec."
             }
           }, delay);

         }    
     }
       catch(Exception e)
       {
    e.printStackTrace();
       }
    };
  };
}

encontrará que hay una pequeña diferencia entre estos dos métodos. Para interrumpirlo, haz algo como esto:

  Thread t = getThread(handle, delay);
  t.start();
  if(t != null)
  {
   if (t.isAlive())
   {
     t.interrupt();
   }
 }

Espero haber ayudado.

Respondido 08 Abr '13, 05:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.