2011-04-28 23 views
30

En Mi aplicación, mi controlador no se detiene. ¿Cómo puedo detener el controlador?
Continúa comenzando después de cerrar la actividad. ¿Que puedo hacer?cómo detener Handler en Android?

el código es:

handler = new Handler() 
     { 
      @Override 
      public void handleMessage(Message msg) 
      { 
       // TODO Auto-generated method stub 
       super.handleMessage(msg); 
       if(i<max) 
       { 
        evnetChangedisplay(i); 
        i++; 
         handler.sendEmptyMessageDelayed(0, 5000); 
        } 
       else 
        { 
         i = 0; 
         handler.sendEmptyMessageDelayed(0,0000); 
        } 
       } 
     }; 
handler.sendEmptyMessageDelayed(0,000); 
+0

¿Qué quiere decir "mi manejador no se detiene"? ¿Cómo entiendes eso? –

+0

Se está ejecutando porque se muestra en DDMS..by SYstem.out.println .. Continúa ejecutándose en mi aplicación ... –

+0

¿quiere decir que continúa recibiendo los mensajes? ¡Entonces deja de enviar esos mensajes al controlador! –

Respuesta

9

considerar:

private Handler myHandler= new Handler(){ 
     @Override 
     public void handleMessage(Message msg){   
      switch(msg.what){ 
       case 0: 
        this.removeMessages(0); 
        messageSendingCodeWhat0(); 
       break; 
       default: 
        super.handleMessage(msg); 
        break; 
      } 
     } 
    }; 
6

Nunca se detiene porque siempre se está enviando un mensaje! Creo que quiere eliminar handler.sendEmptyMessageDelayed(0,0000);, que de hecho no tiene sentido (¿está retrasando un mensaje 0 milisegundos?).

3

Su controlador (si se implementa así) estará activo mientras la instancia de Looper esté activa, que es para todo el ciclo de vida del hilo (que tiene poco que ver con el ciclo de vida de la actividad).

Si desea que el controlador deje de volver a activarse, debe encargarse usted mismo.

Enviando el mensaje 0-retrasado a uno mismo se ve un poco raro, de todos modos. ¿Qué estás tratando de lograr, en realidad?

4

A Handler es simplemente una interfaz con el bucle de eventos de un hilo. Entonces, si detiene el hilo, "detiene" el controlador.

asumiendo que su controlador es para un hilo de fondo.

Aquí hay un ejemplo donde quit() está diseñado para enviar un método looper.quit() al bucle de evento que detendrá el hilo y el controlador.

public class MyThread extends Thread 
{ 
    private Handler m_handler; 

    @Override 
    public void run() 
    { 
     Looper.prepare(); 
     m_handler = new Handler(); 
     Looper.loop(); 
    } 

    // Simply post the quit runnable to the thread's event loop 
    public void quit() 
    { 
     m_handler.post(new QuitLooper()); 
    } 

    // Inner Runnable which can be posted to the handler 
    class QuitLooper implements Runnable 
    { 
     @Override 
     public void run() 
     { 
      Looper.myLooper().quit(); 
     } 
    } 
} 

Por lo tanto, en onPause de su actividad() o onStop() métodos, simplemente llame myThread.quit().

+1

Excelente respuesta. – aez

57

Parece que la actividad finaliza su ciclo de vida antes de que el controlador ejecute el código. Puede gestionar un handler.post (ejecutable) creando un miembro de instancia para el manejador y el ejecutable, y luego administrando el manejador en los métodos del ciclo de vida de la actividad.

private Handler myHandler; 
private Runnable myRunnable = new Runnable() { 
    @Override 
    public void run() { 
     //Do Something 
    } 
}; 

Comience el ejecutable con handler.post.

protected void onStart() { 
    super.onStart(); 
    myHandler = new Handler(); 
    myHandler.post(myRunnable); 

} 

Si el ejecutable no se ha ejecutado en el momento onStop se llama, no queremos para ejecutarlo. Retire la devolución de llamada en el método onStop:

protected void onStop() { 
    super.onStop(); 
    mHandler.removeCallbacks(myRunnable); 
} 
+0

funciona ... probado en mi aplicación. – keithics

+0

myHandler debe estar encendido – mehmet