TimerTask vs Thread.sleep vs Handler postDelayed – наиболее точная функция вызова каждые N миллисекундов?
Каков наиболее точный способ вызова функции каждые N миллисекунд?
- Поток с Thread.sleep
- TimerTask
- Обработчик с postDelayed
Я изменил этот пример, используя Thread.sleep, и это не очень точно.
Я разрабатываю музыкальное приложение, которое будет воспроизводить звуки при заданном BPM. Я понимаю, что невозможно создать полностью точный метроном, и мне не нужно – просто искать лучший способ сделать это.
- Автоматическое обнаружение ошибок в IntelliJ IDEA
- как возобновить прерванный скачать
- Модель памяти Dalvik такая же, как Java?
- В чем разница между compare () и compareTo ()?
- http://10.0.2.2 работает на эмуляторе Android, но не на устройстве Android, используемом в качестве эмулятора
благодаря
- Ввод пользователем петли до тех пор, пока не будут выполнены условия
- java.lang.NumberFormatException: для строки ввода
- Поместить внешнюю библиотеку в JAR?
- Повторное использование просмотров в Android Listview с двумя различными макетами
- Что означает '->' (стрелка) в графе зависимостей gradleиента?
- Уменьшение размера приложения для Android (apk)
- Как вернуть несколько значений?
- Как resize текста заголовка в панели действий?
Есть некоторые недостатки использования таймера
- Он создает только один stream для выполнения задач, и если задача занимает слишком много времени для запуска, другие задачи страдают.
- Он не обрабатывает исключения, брошенные задачами, и stream просто заканчивается, что влияет на другие запланированные задачи, и они никогда не запускаются
ScheduledThreadPoolExecutor правильно справляется со всеми этими проблемами, и нет смысла использовать таймер. Есть два метода, которые могут быть полезны в вашем случае .. scheduleAtFixedRate (…) и scheduleWithFixedDelay (..)
class MyTask implements Runnable { @Override public void run() { System.out.println("Hello world"); } } ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); long period = 100; // the period between successive executions exec.scheduleAtFixedRate(new MyTask(), 0, period, TimeUnit.MICROSECONDS); long delay = 100; //the delay between the termination of one execution and the commencement of the next exec.scheduleWithFixedDelay(new MyTask(), 0, delay, TimeUnit.MICROSECONDS);
На Android вы можете создать Thread с собственным Handler / Message Queue. Это довольно точно. Когда вы видите документацию Handler, вы можете видеть, что она предназначена для этого.
Для обработчика используются два основных способа : (1) планировать сообщения и исполняемые файлы, которые будут выполняться как некоторые моменты в будущем; и (2) установить действие, выполняемое в другом streamе, чем ваше собственное.
Они все одинаковы по точности. Точность и точность таймингов и планировщиков времени Java не гарантируется. См. API Thread.sleep и Object.wait.
Использование TimerTask для действия цикла является лучшим. Рекомендовать