studio reales proyectos programacion introducción incluye herramientas fundamentos fuente código con avanzado aplicaciones android android-handler

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.