Thread.sleep в отдельном потоке при спящем устройстве
Thread.sleep в отдельном потоке при спящем устройстве
Здравствуйте, есть следующая ситуация:
у меня есть отдельный поток, в котором через равные промежутки времени делает http запрос на сервер. Поясню: после выпонения запроса делаю Thread.sleep(2000) и снова выполняю запрос. Все это дело завернуто в while.
Проблема в том, что когда я выключаю экран и шнур питания выткнут, поток да, продолжает работать, но слип начинает делать рандомно, тоесть не 2 секунды, а может быть и 5 секунд, так и 30, так и вообще минуту...время смотрел по логам...даже не знаю, с какого бока к проблеме подойти...
у меня есть отдельный поток, в котором через равные промежутки времени делает http запрос на сервер. Поясню: после выпонения запроса делаю Thread.sleep(2000) и снова выполняю запрос. Все это дело завернуто в while.
Проблема в том, что когда я выключаю экран и шнур питания выткнут, поток да, продолжает работать, но слип начинает делать рандомно, тоесть не 2 секунды, а может быть и 5 секунд, так и 30, так и вообще минуту...время смотрел по логам...даже не знаю, с какого бока к проблеме подойти...
Re: Thread.sleep в отдельном потоке при спящем устройстве
Thread.sleep(2000) + while = зло.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Если это плохо, то как лучше? На каждый новый запрос создавать поток? Не будет слишком расточительно?doter.ua писал(а):Thread.sleep(2000) + while = зло.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Лучше хендлером с postDelayed и еще нужно приостанавливать все "процедуры" когда экран гаснет.neyron91 писал(а):Если это плохо, то как лучше? На каждый новый запрос создавать поток? Не будет слишком расточительно?doter.ua писал(а):Thread.sleep(2000) + while = зло.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Для задачи важно, чтобы запросы всегда посылались и обрабатывались, неважно в каком состоянии находится устройство. По этой причине я использую сервис, запущенный в foreground, который "кидается" notification-ами и/или оповещает с помощью broadcast-ами активити, чтобы обновить данные ui. Надеюсь, примерно понятна моя схема...
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Thread.sleep в отдельном потоке при спящем устройстве
Почему?doter.ua писал(а):Thread.sleep(2000) + while = зло.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Насколько я знаю слип "отказывается от процессорного времени", когда ему его предлагают. по истечении 2000 мс он не начнет работать, а всего лишь "не будет отказываться" от времени и будет ждать когда ему его предложат.Mikhail_dev писал(а):Почему?doter.ua писал(а):Thread.sleep(2000) + while = зло.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Thread.sleep в отдельном потоке при спящем устройстве
Хм, интересное замечание. Спасибо, я как-нибудь протестирую его.
P.S. в отдельном процессе, в сервисе, слип работает без проблем.
P.S. в отдельном процессе, в сервисе, слип работает без проблем.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Используйте это - https://github.com/ReactiveX/RxAndroid , в rxJava более чем достаточно котроля над потоками, точно не помню, но там можно на обсервер интервал повесить. В любом случае вам не нужно ставить sleep, поскольку во первых поведение потоков не гаррантированно как и его жизненный цикл в android, он может просто быть прибит системой либо приоритет будет изменяться и выполняться он будет не когда вам угодно, а когда Андрюша посчитает нужным. Да и вообще в подобных случаях лучше использовать сервисы.neyron91 писал(а):Здравствуйте, есть следующая ситуация:
у меня есть отдельный поток, в котором через равные промежутки времени делает http запрос на сервер. Поясню: после выпонения запроса делаю Thread.sleep(2000) и снова выполняю запрос. Все это дело завернуто в while.
Проблема в том, что когда я выключаю экран и шнур питания выткнут, поток да, продолжает работать, но слип начинает делать рандомно, тоесть не 2 секунды, а может быть и 5 секунд, так и 30, так и вообще минуту...время смотрел по логам...даже не знаю, с какого бока к проблеме подойти...

Re: Thread.sleep в отдельном потоке при спящем устройстве
Спасибо, почитаю как будет время, сейчас его нет ни на изучение, ни тем более внедрение его в проект.altwin писал(а):Используйте это - https://github.com/ReactiveX/RxAndroid
Появилось желание избавиться от слипа вообще и вот тут http://habrahabr.ru/post/136942/ сказано, что "ScheduledThreadPoolExecutor указан как рекомендуемая альтернатива использованию Timer", а Timer в свою очередь подходит для запуска повторяющихся задач. Попробую его, тем более что я в сервисе для асинхронных запросов к серверу использую ExecutorService, который является "родней" ScheduledThreadPoolExecutor
Re: Thread.sleep в отдельном потоке при спящем устройстве
Внедрил я ScheduledThreadPoolExecutor, отказавшись от слипа... но как оказалось проблема была не в этом. Оказывается, надо было всего лишь использовать PowerManager.PARTIAL_WAKE_LOCK, чтобы процессор не уходил в спячку, а продолжал работать. После этого все заработало нормально. Похожую проблему и решение я нашел тут
Re: Thread.sleep в отдельном потоке при спящем устройстве
Я бы твою прогу сразу снес, если бы проверил расход батареи.neyron91 писал(а):Внедрил я ScheduledThreadPoolExecutor, отказавшись от слипа... но как оказалось проблема была не в этом. Оказывается, надо было всего лишь использовать PowerManager.PARTIAL_WAKE_LOCK, чтобы процессор не уходил в спячку, а продолжал работать. После этого все заработало нормально. Похожую проблему и решение я нашел тут
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
