2012-04-03 46 views
0

在什么特定情况下会发生这样的超时?我安排一个警报来定期启动一个服务,所以我创建了一个PendingIntent来定位服务(通过调用PendingIntent.getService(......)),并将它传递给AlarmManager setRepeating(..... ) 方法。报警类型是RTC_WAKEUP。服务正在死亡,在日志中看到“ActivityManager:超时执行服务......”。原因?

正如目前实现的那样,服务不会产生一个单独的线程来完成它的工作,在onStart()中完成所有工作。

该服务执行一些数据库查询,并且我怀疑我现在经常在日志中看到“超时执行服务...”消息的原因,因为我的服务死掉了,这些查询需要更长时间DB增大。

但是,特别是会导致执行超时。

  • 是不是在做main线程的工作?

所以,从产卵在onStart一个单独的线程(),允许在onStart()来及时返回,而DB查询等方式对单独的线程运行将完全消除此问题?还是有什么我失踪?

回答

2

如果你使用android.app.Service作为基类,你正在做主线程上的工作。开发者请不要在主线程上做DB操作!你会放慢系统,很可能会导致你的应用程序的ANR。

使用IntentService而不是Service来确保工作发生在单独的线程上。 IntentService专门用于在单独的线程上执行异步后台处理。

您可以在IntentService本身中设置AlarmManager,然后让它自动重复,无需您的应用程序的干预。向IntentService发送一个“开始”意图,以便第一次启动该服务并设置重复计划。给PendingIntent一个“循环”意图,然后使用AlarmManager.setRepeating设置您的日程安排。定期的,AlarmManager实例会将“循环”意图发送给您的IntentService,并且您可以在其中执行数据库工作。

要停止警报,请有一个“停止”意图,您可以发送将取消警报。

+0

我使用AsyncTask来执行数据库操作... – 2013-07-25 10:22:09