Реализация таймаутов в программном обеспечении

Мой вопрос может быть общим требованием. К сожалению, нигде не нашел подходящего руководства.

Я требую установить таймаут в программном обеспечении на Java. В моей настройке у меня есть мышь, подключенная к устройству Android.

По сути, в моем приложении для Android есть два режима: "ЗАПИСАНО" и "ОТКЛЮЧЕНО"
По умолчанию приложение находится в режиме ОТКЛЮЧЕНО.
Приложение отображает различные экраны в режиме ENGAGED и DISENGAGED, который автоматически управляется в зависимости от режима.
Теперь для входа в режим ENGAGED пользователь должен выполнить щелчок левой кнопкой мыши. Приложение остается в активном режиме, пока пользователь использует мышь. Если пользователь не использует мышь в течение 30 секунд, приложение возвращается в режим ОТКЛЮЧЕНО.

В то время как в программном обеспечении я получаю события для каждого касания, которое выполняет пользователь, очевидно, что я не получаю никакого события, когда прошло 30 секунд с момента последнего касания. Поэтому мне нужно правильное решение для возврата в отключенный режим.

Как реализовать это в программном обеспечении? Базовая схема потока кода должна быть достаточной, не обязательно должна быть точным рабочим кодом. Мне удобно использовать семафоры, задачи, мьютексы и т. Д.

2 ответа

Решение

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

Обычно рекомендуется реализовывать Runnable вместо расширения Thread, поскольку Java имеет единственное наследование. Вот работающий закрытый класс, который должен работать:

private static class CustomRunnable implements Runnable{
    @Override
    public void run() {
        boolean waiting = true;

        while(waiting){
            try {
                Thread.sleep(30000);
                waiting = false;
                // went 30 seconds with no interrupt - go to sleep mode
            } catch (InterruptedException e) {
                waiting = true;
                // we were interrupted by mouse movement - restart loop
            }
        }
    }
}

Вы можете начать поток с помощью

Thread sleepThread = new Thread(new CustomRunnable());
sleepThread.start();

И вы можете сбросить поток, используя

sleepThread.interrupt();

Не поможет ли это сделать: API System.currentTimeInMillis() для currentTimeMillis()

Другие вопросы по тегам