Android: Как обнаружить и собрать несколько кликов (на нескольких представлениях) перед пакетной обработкой

#android #delay #detection

#Android #задержка #обнаружение

Вопрос:

У меня есть несколько интерактивных представлений. Я хочу собрать все клики последовательно, если они находятся в пределах 0,5 секунды после предыдущего клика, а затем выполнить пакетную обработку кликов только через 0,5 секунды после самого последнего клика.

например

 Delay:     0.2    0.4    0.6
Click on A ---> B ---> C ---> D
  

Обработка должна быть «ABC» (скажем, передача их методу обработки в виде строки «ABC»), затем другой процесс для «D». У меня возникли проблемы с тем, чтобы придумать «поживем-увидим». Каков хороший подход для этого?

Заранее спасибо.

Майк

Комментарии:

1. это очень просто, покажите нам, что вы пробовали??

2. Я еще не пробовал какой-либо код. Все еще на стадии обдумывания. Такое ощущение, что какой-то поток сброса таймера в порядке, и если он выполняется до конца, то обрабатывайте все, что у него есть под рукой. Вопрос при таком подходе: как я могу проверить, существует ли поток уже в первую очередь, чтобы я не создавал его при каждом нажатии?

3. лучше сначала выполнить некоторую работу, а затем запросить решения

4. ОК. Позвольте мне попробовать и вернуться позже.

5. @IllegalArgument — Пожалуйста, взгляните на мой подход. Они кажутся нормальными?

Ответ №1:

В итоге я сделал это через обработчик, что довольно просто для этого случая. Для тех, кто заинтересован, я определил обработчик в действии, который обрабатывает назначенное сообщение, которое должно что-то немедленно обработать. Затем при каждом нажатии я очищаю очередь сообщений, а затем отправляю сообщение с задержкой в 0,5 секунды.

 Handler myHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 3001:
            process();
            break;
        }
    }
};
  

и всякий раз, когда есть представление, которое меня интересует, я добавляю следующие строки в его OnClickListener()

 myHandler.removeMessages(3001);
myHandler.sendEmptyMessageDelayed(3001, 500);
  

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

Комментарии:

1. Невозможно принять собственный ответ до истечения 48 часов… сделает это.