Comment annuler un gestionnaire avant l'heure dans le code Android?
-
28-10-2019 - |
Question
Je crée un minuteur différé d'une minute pour arrêter le service s'il n'est pas terminé.Ressemble à ceci:
private Handler timeoutHandler = new Handler();
dans 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 mon travail est accompli avant cette minute, j'aimerais que ce retard soit annulé mais je ne sais pas comment.
La solution
Vous ne pouvez pas vraiment le faire avec un Runnable anonyme.Que diriez-vous d'enregistrer le Runnable dans une variable nommée?
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);
Autres conseils
Si vous ne souhaitez pas conserver une référence du runnable, vous pouvez simplement appeler:
timeoutHandler.removeCallbacksAndMessages(null);
La documentation officielle dit:
... Si le jeton est nul, tous les rappels et messages seront supprimés.
Vous voudrez peut-être remplacer l'utilisation de postDelayed
par l'utilisation de sendMessageDelayed
comme ceci:
private Handler timeoutHandler = new Handler(){
@Override
public void handleMessage(Message msg)
{
switch (msg.what){
case 1:
((Runnable)msg.obj).run();
break;
}
}
};
Ensuite, postez un message:
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);
puis annulez:
timeoutHandler.removeMessages(1);
Aucun suivi du runnable nécessaire.
Si mon travail est accompli avant cette minute, j'aimerais que ce retard soit annulé mais je ne sais pas comment.
Utilisez Handler.removeCallbacks(yourRunnable)
.