Come annullare un gestore prima del tempo nel codice Android?
-
28-10-2019 - |
Domanda
Creo un timer ritardato di 1 minuto per spegnere il servizio se non è completato. Somiglia a questo:
private Handler timeoutHandler = new Handler();
all'interno di 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);
Se ricevo un lavoro realizzato prima di questo 1 minuto, vorrei cancellare questa cosa ritardata ma non sono sicuro di come.
Soluzione
Non puoi davvero farlo con un anonimo Runnable. Che ne dici di salvare il runnable su una variabile denominata?
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);
Altri suggerimenti
Se non vuoi mantenere un riferimento di Runnable, potresti semplicemente chiamare:
timeoutHandler.removeCallbacksAndMessages(null);
La documentazione ufficiale dice:
... Se il token è nullo, tutti i callback e i messaggi verranno rimossi.
Potresti voler sostituire l'uso di postDelayed
Con l'uso di sendMessageDelayed
così:
private Handler timeoutHandler = new Handler(){
@Override
public void handleMessage(Message msg)
{
switch (msg.what){
case 1:
((Runnable)msg.obj).run();
break;
}
}
};
Quindi pubblica un messaggio:
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);
e poi annulla:
timeoutHandler.removeMessages(1);
Nessun tracciamento del Runnable necessario.
Se ricevo un lavoro realizzato prima di questo 1 minuto, vorrei cancellare questa cosa ritardata ma non sono sicuro di come.