J'utilise handler.postDelayed()
pour créer une période d'attente avant la prochaine étape de mon application. Pendant la période d'attente, j'affiche une boîte de dialogue avec une barre de progression et le bouton cancel .
Mon problème est que je ne trouve pas de moyen pour annuler la tâche postDelayed avant le temps imparti.
Je fais ceci pour poster un runnable retardé:
myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH);
Et ceci pour le supprimer: myHandler.removeCallbacks(myRunnable);
Une autre façon est de gérer le Runnable lui-même:
Runnable r = new Runnable {
public void run() {
if (booleanCancelMember != false) {
//do what you need
}
}
}
Cela a fonctionné pour moi lorsque j’ai appelé CancelCallBacks (this) à l’intérieur de la publication exécutable en le remettant via un booléen
Runnable runnable = new Runnable(){
@Override
public void run() {
Log.e("HANDLER", "run: Outside Runnable");
if (IsRecording) {
Log.e("HANDLER", "run: Runnable");
handler.postDelayed(this, 2000);
}else{
handler.removeCallbacks(this);
}
}
};
Voici une classe fournissant une méthode d'annulation pour une action retardée
public class DelayedAction {
private Handler _handler;
private Runnable _runnable;
/**
* Constructor
* @param runnable The runnable
* @param delay The delay (in milli sec) to wait before running the runnable
*/
public DelayedAction(Runnable runnable, long delay) {
_handler = new Handler(Looper.getMainLooper());
_runnable = runnable;
_handler.postDelayed(_runnable, delay);
}
/**
* Cancel a runnable
*/
public void cancel() {
if ( _handler == null || _runnable == null ) {
return;
}
_handler.removeCallbacks(_runnable);
}}