【发布时间】:2011-07-30 18:49:29
【问题描述】:
我正在开发我的第一个 Android 应用程序,但在使用 AlarmManager 时遇到了问题。我的应用程序安排了一个警报来检查一些 URL 的数据。好吧,有时当警报运行时,我在 logcat 中收到“ANR”错误(我假设这代表应用程序没有响应,通过我手机上的对话框)。在以下日志条目之后,该错误显示了手机上运行的每个进程以及一些统计信息:
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?如果我这样做,它会允许手机在执行完成之前进入睡眠状态吗?或者,我应该使用部分唤醒锁启动服务吗?
【问题讨论】:
标签: android broadcastreceiver alarmmanager