reales - ¿Cómo cancelar un controlador antes de tiempo en el código de Android?
manual android studio avanzado (4)
Si realizo el trabajo antes de este minuto, me gustaría que se cancelara este retraso, pero no estoy seguro de cómo hacerlo.
Utilice Handler.removeCallbacks(yourRunnable)
.
Si no se completa, creo un temporizador retrasado de 1 minuto para apagar el servicio. Se ve como esto:
private Handler timeoutHandler = new Handler();
dentro de 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 realizo el trabajo antes de este minuto, me gustaría que se cancelara este retraso, pero no estoy seguro de cómo hacerlo.
Es posible que desee reemplazar el uso de postDelayed
con el uso de sendMessageDelayed
de la sendMessageDelayed
manera:
private Handler timeoutHandler = new Handler(){
@Override
public void handleMessage(Message msg)
{
switch (msg.what){
case 1:
((Runnable)msg.obj).run();
break;
}
}
};
Luego publica 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 el seguimiento de la ejecución.
Realmente no puedes hacerlo con un Runnable anónimo. ¿Qué hay de guardar el Runnable en una variable con nombre?
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);
Si no desea mantener una referencia del ejecutable, simplemente llame:
timeoutHandler.removeCallbacksAndMessages(null);
La documentación oficial dice:
... Si el token es nulo, se eliminarán todas las devoluciones de llamada y los mensajes.