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

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

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

Нет ничего страшного в removeMessages() ; Они совершенно безопасны. Структура в значительной степени зависит от этих методов, и они используются во многих местах, особенно в виджетах по умолчанию ( View , ListView и т. Д.). Это намного лучше, чем создание Handler который игнорирует определенные сообщения. Это программирование, не ходите со своими чувствами: p

Многие разработчики и большая часть исходного кода, который вы найдете, будут показывать людям, передавая анонимные функции обработчику, поэтому я думаю, что в некоторых случаях вы можете быть не уверены, как их удалить. Простое решение состоит в том, чтобы объявить ваш runnable, как и любой другой объект, и сохранить указатель на него, который можно использовать для удаления любого экземпляра из очереди обработчика.

 private Runnable lastMyRunnablePtr = null; 

 private class MyRunnable implements Runnable {} 

….

 lastMyRunnablePtr = new MyRunnable(); mHandler.postDelayed(lastMyRunnablePtr ,30000); 

….

 protected void onDestroy() { mHandler.removeCallbacks(lastMyRunnablePtr); } 

Собственно, вы должны рассмотреть реализацию 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); 

Отправить этот пост .