Страница 1 из 1
Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 28 мар 2015, 09:02
neyron91
Здравствуйте, есть следующая ситуация:
у меня есть отдельный поток, в котором через равные промежутки времени делает http запрос на сервер. Поясню: после выпонения запроса делаю Thread.sleep(2000) и снова выполняю запрос. Все это дело завернуто в while.
Проблема в том, что когда я выключаю экран и шнур питания выткнут, поток да, продолжает работать, но слип начинает делать рандомно, тоесть не 2 секунды, а может быть и 5 секунд, так и 30, так и вообще минуту...время смотрел по логам...даже не знаю, с какого бока к проблеме подойти...
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 28 мар 2015, 11:28
doter.ua
Thread.sleep(2000) + while = зло.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 28 мар 2015, 13:46
neyron91
doter.ua писал(а):Thread.sleep(2000) + while = зло.
Если это плохо, то как лучше? На каждый новый запрос создавать поток? Не будет слишком расточительно?
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 28 мар 2015, 15:26
doter.ua
neyron91 писал(а):doter.ua писал(а):Thread.sleep(2000) + while = зло.
Если это плохо, то как лучше? На каждый новый запрос создавать поток? Не будет слишком расточительно?
Лучше хендлером с postDelayed и еще нужно приостанавливать все "процедуры" когда экран гаснет.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 28 мар 2015, 16:21
neyron91
Для задачи важно, чтобы запросы всегда посылались и обрабатывались, неважно в каком состоянии находится устройство. По этой причине я использую сервис, запущенный в foreground, который "кидается" notification-ами и/или оповещает с помощью broadcast-ами активити, чтобы обновить данные ui. Надеюсь, примерно понятна моя схема...
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 28 мар 2015, 23:48
Mikhail_dev
doter.ua писал(а):Thread.sleep(2000) + while = зло.
Почему?
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 29 мар 2015, 13:46
doter.ua
Mikhail_dev писал(а):doter.ua писал(а):Thread.sleep(2000) + while = зло.
Почему?
Насколько я знаю слип "отказывается от процессорного времени", когда ему его предлагают. по истечении 2000 мс он не начнет работать, а всего лишь "не будет отказываться" от времени и будет ждать когда ему его предложат.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 29 мар 2015, 17:35
Mikhail_dev
Хм, интересное замечание. Спасибо, я как-нибудь протестирую его.
P.S. в отдельном процессе, в сервисе, слип работает без проблем.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 29 мар 2015, 17:49
altwin
neyron91 писал(а):Здравствуйте, есть следующая ситуация:
у меня есть отдельный поток, в котором через равные промежутки времени делает http запрос на сервер. Поясню: после выпонения запроса делаю Thread.sleep(2000) и снова выполняю запрос. Все это дело завернуто в while.
Проблема в том, что когда я выключаю экран и шнур питания выткнут, поток да, продолжает работать, но слип начинает делать рандомно, тоесть не 2 секунды, а может быть и 5 секунд, так и 30, так и вообще минуту...время смотрел по логам...даже не знаю, с какого бока к проблеме подойти...
Используйте это -
https://github.com/ReactiveX/RxAndroid , в rxJava более чем достаточно котроля над потоками, точно не помню, но там можно на обсервер интервал повесить. В любом случае вам не нужно ставить sleep, поскольку во первых поведение потоков не гаррантированно как и его жизненный цикл в android, он может просто быть прибит системой либо приоритет будет изменяться и выполняться он будет не когда вам угодно, а когда Андрюша посчитает нужным. Да и вообще в подобных случаях лучше использовать сервисы.
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 30 мар 2015, 05:51
neyron91
Спасибо, почитаю как будет время, сейчас его нет ни на изучение, ни тем более внедрение его в проект.
Появилось желание избавиться от слипа вообще и вот тут
http://habrahabr.ru/post/136942/ сказано, что "ScheduledThreadPoolExecutor указан как рекомендуемая альтернатива использованию Timer", а Timer в свою очередь подходит для запуска повторяющихся задач. Попробую его, тем более что я в сервисе для асинхронных запросов к серверу использую ExecutorService, который является "родней" ScheduledThreadPoolExecutor

Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 01 апр 2015, 08:27
neyron91
Внедрил я ScheduledThreadPoolExecutor, отказавшись от слипа... но как оказалось проблема была не в этом. Оказывается, надо было всего лишь использовать
PowerManager.PARTIAL_WAKE_LOCK, чтобы процессор не уходил в спячку, а продолжал работать. После этого все заработало нормально. Похожую проблему и решение я нашел
тут
Re: Thread.sleep в отдельном потоке при спящем устройстве
Добавлено: 01 апр 2015, 10:30
doter.ua
neyron91 писал(а):Внедрил я ScheduledThreadPoolExecutor, отказавшись от слипа... но как оказалось проблема была не в этом. Оказывается, надо было всего лишь использовать
PowerManager.PARTIAL_WAKE_LOCK, чтобы процессор не уходил в спячку, а продолжал работать. После этого все заработало нормально. Похожую проблему и решение я нашел
тут
Я бы твою прогу сразу снес, если бы проверил расход батареи.