Подтвердить что ты не робот

Как удалить задержанные сообщения до того, как они прибудут к обработчику?

Моя проблема в том, что мне нужно отправлять сообщения с задержкой в ​​1 секунду. Затем обработчик инициирует какое-то действие, вы получаете изображение.

Тем не менее существуют некоторые условия, в которых уже отправленное сообщение должно быть удалено (до второго истекшего), чтобы предотвратить выполнение обработчиком ничего. Я не мог понять, как это сделать (или если это возможно), поэтому, если кто-то из вас имеет ключ, пожалуйста, дайте мне знать..

4b9b3361

Ответ 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);

Откроется сообщение.