2010-12-07 5 views
199

Я использую handler.postDelayed(), чтобы создать период ожидания до следующего этапа моего приложения. Во время периода ожидания я показываю диалог с индикатором выполнения и отменил.Отмена обработчика.postdelayed process

Моя проблема заключается в том, что я не могу найти способ до отменить postDelayed задание до истечения времени.

+0

Возможный дубликат [Как удалить runnable из объекта обработчика, добавленного postDelayed?] (Http://stackoverflow.com/questions/3627216/how-to-remove-a-runnable-from-a- handler-object-added-by-postdelayed) – sschuberth

ответ

399

Я делаю это, чтобы получить возможность отправлять задержанная работоспособной:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

И это, чтобы удалить его: myHandler.removeCallbacks(myRunnable);

+60

Если вы можете позволить себе отменить все обратные вызовы и сообщения на обработчике и не хотите, чтобы они сохраняли ссылки на исполняемый файл, третий пункт в принятом ответе на этот вопрос является другой альтернативой что, похоже, все равно работает для моего случая: http://stackoverflow.com/questions/11299440/onbackpressed-to-kill-a-handler-within-an-activity-android (по сути, вызов myHandler.removeCallbacksAndMessages (null);) – Mick

+0

removeCallbacksAndMessages может сделать трюк, но лично я предпочитаю иметь контроль над запланированными runnables. Приведение в действие и обработка пары Runnables не убьет вас приложением; в противном случае, если вам нужно больше двух или трех Runnables, вам может понадобиться нечто более мощное, imho. –

14

Другой способ справиться сам Runnable:

Runnable r = new Runnable { 
    public void run() { 
     if (booleanCancelMember != false) { 
      //do what you need 
     } 
    } 
} 
+14

Не будет ли booleanCancelMember окончательным, что означает, что он не может быть изменен и, следовательно, бесполезен для этой цели? – stealthcopter

+8

@stealthcopter нет, это не обязательно. –

+0

Это делает, если вы делаете Runnable anonymous – pablisco

1

Он работал меня, когда я вызвал CancelCallBacks (это) внутри пост-задержанного запуска, передав его через boolean

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); 
     } 
    } 
}; 
+0

В вашем коде нет «CancelCallBacks». Может быть, потому что его не существует? :) –

12

В случае, если у вас есть несколько внутренних/анонимные runnables передаются тот же обработчик, и вы хотите, чтобы отменить все в одном случае использовать

handler.removeCallbacksAndMessages(null);

Согласно документации,

Remove любые ожидающие сообщения обратных вызовов и отправленные сообщения, чей obj - токен . Если токен равен нулю, все обратные вызовы и сообщения будут удалены.