Как удалить задержанные сообщения до того, как они прибудут к обработчику?
Моя проблема в том, что мне нужно отправлять сообщения с задержкой в 1 секунду. Затем обработчик инициирует какое-то действие, вы получаете изображение.
Тем не менее существуют некоторые условия, в которых уже отправленное сообщение должно быть удалено (до второго истекшего), чтобы предотвратить выполнение обработчиком ничего. Я не мог понять, как это сделать (или если это возможно), поэтому, если кто-то из вас имеет ключ, пожалуйста, дайте мне знать..
Ответы
Ответ 1
Нет ничего страшного в отношении методов removeMessages()
; они совершенно безопасны. Структура в значительной степени зависит от этих методов, и они используются во многих местах, особенно в виджетах по умолчанию (View
, ListView
и т.д.). Это намного лучше, чем создание Handler
, которое игнорирует определенные сообщения. Это программирование, не ходите со своими чувствами: p
Ответ 2
Многие разработчики и большая часть исходного кода, которые вы найдете, будут показывать людям, передавая анонимные функции обработчику, поэтому я думаю, что в некоторых случаях вы можете быть не уверены, как их удалить. Простое решение состоит в том, чтобы объявить ваш runnable, как и любой другой объект, и сохранить указатель на него, который можно использовать для очистки любого экземпляра из очереди обработчика.
private Runnable lastMyRunnablePtr = null;
...
private class MyRunnable implements Runnable
{}
....
lastMyRunnablePtr = new MyRunnable();
mHandler.postDelayed(lastMyRunnablePtr ,30000);
....
protected void onDestroy() {
mHandler.removeCallbacks(lastMyRunnablePtr);
}
Ответ 3
Собственно, вы должны рассмотреть реализацию handler.removeMessages(int, obj)
. Если obj - объект, связанный с автобоксингом, вы столкнетесь с проблемой реализации android MessageQueue
.
Для следующего фрагмента кода removeMessages не будет работать в результате автоматического бокса, бокса-преобразования и реализации MessageQueue используя объект p.obj == для сравнения объекта.
Message msg = handler.obtainMessage(what, 256);
handler.sendMessageDelayed(message, delayMillis);
handler.removeMessages(what, 256);
Откроется сообщение.