Android

How to remove all callbacks from a Handler?

Как удалить все обратные вызовы из обработчика?

У меня есть обработчик из моего подактива, который был вызван основным действием. Этот обработчик используется подклассами для postDelay некоторых исполняемых файлов, и я не могу ими управлять. Теперь, в onStop событии, мне нужно удалить их перед завершением действия (каким-то образом я вызвал finish(), но он все равно вызывается снова и снова). Есть ли способ удалить все обратные вызовы из обработчика?

Переведено автоматически
Ответ 1

По моему опыту, вызов этого отлично сработал!

handler.removeCallbacksAndMessages(null);

В документации для removeCallbacksAndMessages сказано...


Удалите все ожидающие публикации обратных вызовов и отправленных сообщений, объектом которых является токен. Если токен равен null, все обратные вызовы и сообщения будут удалены.


Ответ 2

Для любого конкретного Runnable экземпляра вызывайте Handler.removeCallbacks(). Обратите внимание, что он использует сам Runnable экземпляр, чтобы определить, какие обратные вызовы отменить регистрацию, поэтому, если вы создаете новый экземпляр каждый раз, когда выполняется публикация, вам нужно убедиться, что у вас есть ссылки на точные Runnable для отмены. Пример:

Handler myHandler = new Handler();
Runnable myRunnable = new Runnable() {
public void run() {
//Some interesting task
}
};

Вы можете вызвать myHandler.postDelayed(myRunnable, x), чтобы отправить другой обратный вызов в очередь сообщений в других местах вашего кода, и удалить все ожидающие обратные вызовы с помощью myHandler.removeCallbacks(myRunnable)

К сожалению, вы не можете просто "очистить" весь MessageQueue для Handler, даже если вы делаете запрос для MessageQueue объекта, связанного с ним, потому что методы добавления и удаления элементов защищены пакетом (их могут вызывать только классы в пакете android.os). Возможно, вам придется создать тонкий Handler подкласс для управления списком Runnableобъектов по мере их публикации / выполнения ... или посмотрите на другую парадигму передачи ваших сообщений между каждым Activity

Надеюсь, это поможет!

Ответ 3

Определите новый обработчик и runnable:

private Handler handler = new Handler(Looper.getMainLooper());
private Runnable runnable = new Runnable() {
@Override
public void run() {
// Do what ever you want
}
};

Задержка отправки вызова:

handler.postDelayed(runnable, sleep_time);

Удалите обратный вызов из вашего обработчика:

handler.removeCallbacks(runnable);
Ответ 4

Пожалуйста, обратите внимание, что следует определить a Handler и a Runnable в области видимости класса, чтобы он создавался один раз.removeCallbacks(Runnable) работает корректно, если не определять их несколько раз. Пожалуйста, посмотрите на следующие примеры для лучшего понимания:

Неправильный способ :

    public class FooActivity extends Activity {
private void handleSomething(){
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
doIt();
}
};
if(shouldIDoIt){
//doIt() works after 3 seconds.
handler.postDelayed(runnable, 3000);
} else {
handler.removeCallbacks(runnable);
}
}

public void onClick(View v){
handleSomething();
}
}

Если вы вызываете onClick(..) метод, вы никогда не останавливаете doIt() вызов метода перед его вызовом. Потому что каждый раз создаются экземпляры new Handler и new Runnable. Таким образом, вы потеряли необходимые ссылки, которые принадлежат экземплярам handler и runnable.

Правильный способ :

 public class FooActivity extends Activity {
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
doIt();
}
};
private void handleSomething(){
if(shouldIDoIt){
//doIt() works after 3 seconds.
handler.postDelayed(runnable, 3000);
} else {
handler.removeCallbacks(runnable);
}
}

public void onClick(View v){
handleSomething();
}
}

Таким образом, вы не теряете фактические ссылки и removeCallbacks(runnable) работает успешно.

Ключевое предложение заключается в том, что 'определите их как глобальные в вашем Activity или Fragment том, что вы используете'.

java android