Сообщение Android ANR из-за длительной проблемы с работой - PullRequest
1 голос
/ 12 июня 2011

В общем, мой вопрос - как заставить фоновую службу запускать каждый «ИНТЕРВАЛ», а не получать сообщение ANR (пытался создать службу, вызываемую из alarmManager, которая запускает поток для выполнения своей работы)? Спасибо за любую помощь!

Более конкретно:

Я делаю приложение, похожее на DropBox, - делаю локальную папку доступной для других телефонов Android.

Это приложение должно работать в фоновом режиме.

Он также должен запускаться через определенные промежутки времени, чтобы проверить, созданы ли какие-либо новые данные в локальном каталоге для загрузки их на какой-либо сервер.

Мое приложение в целом выполняет следующую последовательность в PsudoCode:

1) AlarmManager.setInexactRepeating(MySerVice)
2) (when the service is being called) DecideWhichFileToUploadOrDownload()
3) UploadNewFiles() DownloadNewFiles()

Я знаю, что проблема связана со стадией 3, после загрузки / выгрузки, которая занимает более 10 секунд, я получаю сообщение ANR (или мое приложение уничтожается), если выгрузка / загрузка короче, чем 10 секунд, чем все работает просто отлично. Я пытался создать поток, который будет выполнять загрузку / выгрузку, но как только Служба будет завершена, Android уничтожит мою тему.

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

как заставить фоновую службу запускать каждый "ИНТЕРВАЛ", а не получать сообщение ANR

Использовать IntentService, чтобы работа выполнялась в фоновом потоке.

Я пытался создать поток, который будет выполнять загрузку / выгрузку, но как только Служба будет завершена, Android уничтожит мою тему.

Именно поэтому вы должны использовать IntentService, поскольку Android управляет как фоновым потоком, так и останавливая Service для вас.Вы просто отправляете работу через startService() и выполняете работу в onHandleIntent().

1 голос
/ 16 августа 2011

Не забывайте, что когда ваша служба (вызывается службой Alarm) делает то, что может потребовать длительного выполнения и / или асинхронного использования, вы можете использовать IntentService или собственную службу обмена сообщениями

и WakeLock (см. PowerManager)

в противном случае устройство может вернуться / перейти в состояние «глубокого сна». Тогда состояние ЦП будет равняться до следующего «события»
Приобретите WakeLock КАК МОЖНО СКОРЕЕ в вашем сервисе и обязательно выпустите его в конце вашей фоновой работы ...

...