Реализация таймаутов в программном обеспечении
Мой вопрос может быть общим требованием. К сожалению, нигде не нашел подходящего руководства.
Я требую установить таймаут в программном обеспечении на 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()