2011-05-04 4 views
19

Creo 1 minuto de temporizador retrasado para apagar el servicio si no se completa. Se ve así:Cómo cancelar Handler en el código?

private Handler timeoutHandler = new Handler(); 

dentro onCreate()

timeoutHandler.postDelayed(new Runnable() 
     { 
      public void run() 
      { 
       Log.d(LOG_TAG, "timeoutHandler:run"); 

       DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); 
       finalizeService(); 
      } 
     }, 60 * 1000); 

Si consigo trabajo cortado antes de este 1 minuto - me gustaría conseguir esta cosa retardada cancelado pero no sabe cómo.

Respuesta

41

Realmente no puedes hacerlo con un Runnable anónimo. ¿Qué hay de guardar el Runnable a una variable nombrada?

Runnable finalizer = new Runnable() 
    { 
     public void run() 
     { 
      Log.d(LOG_TAG, "timeoutHandler:run"); 

      DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); 
      finalizeService(); 
     } 
    }; 
timeoutHandler.postDelayed(finalizer, 60 * 1000); 

... 

// Cancel the runnable 
timeoutHandler.removeCallbacks(finalizer); 
+1

tiemoutHandler.removeCallbacksAndMessages (null); para eliminar todas las devoluciones de llamada para manejar un Runnable anónimo. (como se menciona en la respuesta de AbdelHady) – Lorenz03Tx

+2

Eso es genial siempre y cuando no te importe eliminar TODAS las devoluciones de llamada, no solo esta. OP preguntó sobre la eliminación de una devolución de llamada en particular. –

+0

Muchas gracias hombre –

8

Es posible que desee reemplazar el uso de postDelayed con el uso de sendMessageDelayed así:

private Handler timeoutHandler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
      switch (msg.what){ 
     case 1: 
      ((Runnable)msg.obj).run(); 
      break; 
     } 
    } 
}; 

A continuación, enviar un mensaje:

Message m = Message.obtain(); 
m.what = 1; 
m.obj = new Runnable(){ 
      public void run() 
      { 
       Log.d(LOG_TAG, "timeoutHandler:run"); 

       DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); 
       finalizeService(); 
      } 
     }; 
timeoutHandler.sendMessageDelayed(m, 60 * 1000); 

y luego cancelar:

timeoutHandler.removeMessages(1); 

No es necesario rastrear el ejecutable.

10

Si no desea mantener una referencia del ejecutable, simplemente podría llamar:

timeoutHandler.removeCallbacksAndMessages(null); 

The official documentation dice:

... Si token es nulo, todas las devoluciones de llamada y los mensajes serán eliminados