Thread.sleep в отдельном потоке при спящем устройстве

Ответить
neyron91
Сообщения: 5
Зарегистрирован: 28 мар 2015, 08:15

Thread.sleep в отдельном потоке при спящем устройстве

Сообщение neyron91 » 28 мар 2015, 09:02

Здравствуйте, есть следующая ситуация:
у меня есть отдельный поток, в котором через равные промежутки времени делает http запрос на сервер. Поясню: после выпонения запроса делаю Thread.sleep(2000) и снова выполняю запрос. Все это дело завернуто в while.

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

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение doter.ua » 28 мар 2015, 11:28

Thread.sleep(2000) + while = зло.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

neyron91
Сообщения: 5
Зарегистрирован: 28 мар 2015, 08:15

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение neyron91 » 28 мар 2015, 13:46

doter.ua писал(а):Thread.sleep(2000) + while = зло.
Если это плохо, то как лучше? На каждый новый запрос создавать поток? Не будет слишком расточительно?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение doter.ua » 28 мар 2015, 15:26

neyron91 писал(а):
doter.ua писал(а):Thread.sleep(2000) + while = зло.
Если это плохо, то как лучше? На каждый новый запрос создавать поток? Не будет слишком расточительно?
Лучше хендлером с postDelayed и еще нужно приостанавливать все "процедуры" когда экран гаснет.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

neyron91
Сообщения: 5
Зарегистрирован: 28 мар 2015, 08:15

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение neyron91 » 28 мар 2015, 16:21

Для задачи важно, чтобы запросы всегда посылались и обрабатывались, неважно в каком состоянии находится устройство. По этой причине я использую сервис, запущенный в foreground, который "кидается" notification-ами и/или оповещает с помощью broadcast-ами активити, чтобы обновить данные ui. Надеюсь, примерно понятна моя схема...


Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение doter.ua » 29 мар 2015, 13:46

Mikhail_dev писал(а):
doter.ua писал(а):Thread.sleep(2000) + while = зло.
Почему?
Насколько я знаю слип "отказывается от процессорного времени", когда ему его предлагают. по истечении 2000 мс он не начнет работать, а всего лишь "не будет отказываться" от времени и будет ждать когда ему его предложат.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение Mikhail_dev » 29 мар 2015, 17:35

Хм, интересное замечание. Спасибо, я как-нибудь протестирую его.
P.S. в отдельном процессе, в сервисе, слип работает без проблем.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение altwin » 29 мар 2015, 17:49

neyron91 писал(а):Здравствуйте, есть следующая ситуация:
у меня есть отдельный поток, в котором через равные промежутки времени делает http запрос на сервер. Поясню: после выпонения запроса делаю Thread.sleep(2000) и снова выполняю запрос. Все это дело завернуто в while.

Проблема в том, что когда я выключаю экран и шнур питания выткнут, поток да, продолжает работать, но слип начинает делать рандомно, тоесть не 2 секунды, а может быть и 5 секунд, так и 30, так и вообще минуту...время смотрел по логам...даже не знаю, с какого бока к проблеме подойти...
Используйте это - https://github.com/ReactiveX/RxAndroid , в rxJava более чем достаточно котроля над потоками, точно не помню, но там можно на обсервер интервал повесить. В любом случае вам не нужно ставить sleep, поскольку во первых поведение потоков не гаррантированно как и его жизненный цикл в android, он может просто быть прибит системой либо приоритет будет изменяться и выполняться он будет не когда вам угодно, а когда Андрюша посчитает нужным. Да и вообще в подобных случаях лучше использовать сервисы.
Изображение

neyron91
Сообщения: 5
Зарегистрирован: 28 мар 2015, 08:15

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение neyron91 » 30 мар 2015, 05:51

altwin писал(а):Используйте это - https://github.com/ReactiveX/RxAndroid
Спасибо, почитаю как будет время, сейчас его нет ни на изучение, ни тем более внедрение его в проект.

Появилось желание избавиться от слипа вообще и вот тут http://habrahabr.ru/post/136942/ сказано, что "ScheduledThreadPoolExecutor указан как рекомендуемая альтернатива использованию Timer", а Timer в свою очередь подходит для запуска повторяющихся задач. Попробую его, тем более что я в сервисе для асинхронных запросов к серверу использую ExecutorService, который является "родней" ScheduledThreadPoolExecutor :)

neyron91
Сообщения: 5
Зарегистрирован: 28 мар 2015, 08:15

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение neyron91 » 01 апр 2015, 08:27

Внедрил я ScheduledThreadPoolExecutor, отказавшись от слипа... но как оказалось проблема была не в этом. Оказывается, надо было всего лишь использовать PowerManager.PARTIAL_WAKE_LOCK, чтобы процессор не уходил в спячку, а продолжал работать. После этого все заработало нормально. Похожую проблему и решение я нашел тут

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Thread.sleep в отдельном потоке при спящем устройстве

Сообщение doter.ua » 01 апр 2015, 10:30

neyron91 писал(а):Внедрил я ScheduledThreadPoolExecutor, отказавшись от слипа... но как оказалось проблема была не в этом. Оказывается, надо было всего лишь использовать PowerManager.PARTIAL_WAKE_LOCK, чтобы процессор не уходил в спячку, а продолжал работать. После этого все заработало нормально. Похожую проблему и решение я нашел тут
Я бы твою прогу сразу снес, если бы проверил расход батареи.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ответить