2011-02-25 65 views
1

我有一个AlarmService每15分钟醒来一次,然后触发一个IntentService。然而,我想确认一下,如果以前启动的IS已经在运行,那么AlarmService不会尝试启动另一个(IS正在处理文件,如果第二个版本尝试着将会出现奇怪的竞争状态对相同的文件采取行动)。我有什么选择来检查IntentService是否已经在运行?

什么是轮询系统查看我的IS的一个实例是否已经在运行并且只是跳过AlarmService cron的当前迭代的最佳方式?

回答

8

AlarmService不会尝试启动另一个(IS正在处理文件,如果第二个版本试图对相同文件执行操作,会出现奇怪的竞态条件)。

不会有比赛条件。首先,将只有一个IntentService的实例。其次,IntentService只能在onHandleIntent()中一次处理一个Intent

什么是最好的方式来轮询系统,看看我的信息系统的实例是否已经运行,只是跳过AlarmService cron的当前迭代?

不要那样做。在您的IntentService中,跟踪您最近一次在数据成员中工作的时间。如果在onHandleIntent()中,该值为null,这是您一段时间的第一次传递,因此您可能想要继续并完成工作。如果值不是null,请将其与当前时间进行比较,如果太快,则从onHandleIntent()返回。

+0

我不确定我是否理解,但让我描述一下我关心的确切性质。 InterntService正在处理上传文件到服务器。有一个面向客户端的应用程序正在拍摄照片,但该设备很可能位于3G连接位于0的位置。因此,想法是尽可能卸载图像。在我的设计中,闹钟每15分钟关闭一次,并调用在图像所在的文件夹中查找的Intent,如果发现任何请求,则尝试上载它们。但是,上传这些文件可能需要15分钟以上,并且当时下一个 – 2011-02-27 01:34:50

+0

警报会唤醒Intent,它可能会看到相同的文件并尝试上传它们,即使另一个文件正在处理这些文件。您是否说过,警报调用的IntentService将成为执行堆栈中的一个单独项目,并且只会继续执行其业务,而不会将第二个项目调入组合中? – 2011-02-27 01:36:32

+0

@Dr。 Dredel:“它可能会看到相同的文件并尝试上传它们,即使另一个文件正在处理这些文件” - 除非您的服务有问题,否则这是不可能的。 “你是说,警报所称的IntentService将是一个单独的项目......并且只会继续关注其业务,而不会将第二个业务称为混合业务?” - 是的。在'onHandleIntent()'完成处理第一个报警'Intent'后,第二个报警的'Intent'将被* same *'IntentService' *处理。 IntentService是一个工作队列,所有的服务都是单例。 – CommonsWare 2011-02-27 12:33:04

相关问题