Как система Android ведет себя с потоками, которые спят слишком долго? - PullRequest
2 голосов
/ 05 апреля 2011

Так что в моей активности "Домой" в моем приложении для Android у меня есть не-бесовская тема, которая постоянно работает в фоновом режиме и проверяет блог на наличие новых сообщений каждые 30 минут или около того, чтобы запускать уведомления. Он работает нормально, когда я заставляю поток спать в течение нескольких секунд в целях тестирования, чтобы убедиться, что он действительно работает в фоновом режиме, но в реальном телефоне, когда событие должно срабатывать через полчаса, он просто не работает. «т. Поэтому мой вопрос: когда я делаю * Thread.sleep (30_MINUTES) *, уничтожает ли его система Android или что-то слишком долго неактивное? Андроид убивает сонные темы?

Ответы [ 4 ]

2 голосов
/ 12 апреля 2011

ОК, так что проблема была решена.Проблема была в том, что в Android, когда вы переводите Thread в спящий режим, скажем, на 30 минут, когда устройство переходит в спящий режим (экран отключается после бездействия на телефоне), процессор переходит в так называемое «состояние глубокого сна».msgstr "который вызывает счетчик потока, который пробуждает поток, чтобы сделать паузу, пока экран выключен.Это означает, что когда вы говорите, например, Thread.sleep (500000), эти 500000 миллисекунд считаются только тогда, когда телефон активен.Решение состоит в том, чтобы использовать AlarmManager и BroadcastReceiver для периодического запуска кода.

Вот простое руководство по использованию AlarmManager с BroadcastReceiver: http://justcallmebrian.com/?p=129

2 голосов
/ 05 апреля 2011

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

0 голосов
/ 05 апреля 2011

Что именно происходит за это время? Я полагаю, что единственная ситуация, в которой то, что вы описываете (используя описанную вами технику), будет работать надежно, - это если (а) ваше действие (или другое действие или служба, выполняемая в одном и том же процессе) является основным действием для всего процесса. жизнь потока и (б) есть пробуждение, мешающее процессору спать.

Android может не уничтожать отдельные потоки, но он может и будет уничтожать процессы на основе жизненного цикла процесса .

0 голосов
/ 05 апреля 2011

Я не уверен, что вы делаете в своем коде, но определенно система Android не убивает поток самостоятельно, неважно, сонливость или нет.

...