Детали Android AlarmManager? - PullRequest
       0

Детали Android AlarmManager?

1 голос
/ 30 июля 2011

Я работаю над своим первым приложением для Android, и у меня возникают проблемы с использованием AlarmManager. Мое приложение планирует тревогу, чтобы проверить несколько URL-адресов для данных. Ну, иногда, когда срабатывает будильник, я получаю ошибку «ANR» в logcat (которая, как я полагаю, означает, что приложение не отвечает, в диалоговом окне, которое я получаю на своем телефоне). Ошибка показывает каждый процесс, запущенный на телефоне с некоторой статистикой, после следующих записей журнала:

07-30 14:11:07.442: WARN/ActivityManager(2735): Timeout of broadcast BroadcastRecord{48d749d8 null} - receiver=android.os.BinderProxy@49088bc0
07-30 14:11:07.442: WARN/ActivityManager(2735): Receiver during timeout: ResolveInfo{48d74950 com.shaddow.courseChecker.CourseAlarm p=0 o=0 m=0x0}
07-30 14:11:07.477: INFO/Process(2735): Sending signal. PID: 25006 SIG: 3
07-30 14:11:07.477: INFO/dalvikvm(25006): threadid=3: reacting to signal 3
07-30 14:11:07.567: INFO/dalvikvm(25006): Wrote stack traces to '/data/anr/traces.txt'

Затем следует еще множество SIG 3 для каждого процесса, а затем:

07-30 14:11:08.118: ERROR/ActivityManager(2735): ANR in com.shaddow.courseChecker
07-30 14:11:08.118: ERROR/ActivityManager(2735): Reason: Broadcast of Intent { flg=0x4 cmp=com.shaddow.courseChecker/.CourseAlarm (has extras) }
07-30 14:11:08.118: ERROR/ActivityManager(2735): Load: 0.65 / 2.76 / 2.49
07-30 14:11:08.118: ERROR/ActivityManager(2735): CPU usage from 420741ms to 26ms ago:

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

Что касается исправления ... Должен ли я запускать свой код в отдельном потоке в onReceive (), чтобы он не отправлял ANR пользователю? Если я это сделаю, это позволит телефону спать, прежде чем он будет выполнен? Или мне следует запустить службу с частичной блокировкой пробуждения?

1 Ответ

0 голосов
/ 30 июля 2011

Должен ли я запускать свой код в отдельном потоке в onReceive (), чтобы он не отправлял ANR пользователю?

Да.Точнее:

  • Напишите IntentService, где вы выполняете загрузку в onHandleIntent()
  • Пусть ваш AlarmManager сигнал тревоги запустит эту службу через getService() PendingIntent

Если вы намереваетесь выполнить эту работу, даже если устройство спит, используя сигнал тревоги _WAKEUP, вы можете рассмотреть возможность использования моего WakefulIntentService и следующихтребуемый шаблон для поддержания устройства в рабочем состоянии во время выполнения этой работы - проект demo/ на этом сайте иллюстрирует это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...