我已经设置了一个每隔60秒左右运行一次的periodicTask。它应该只需要一秒钟或2秒运行,因此不太可能发生任何重叠,但是如果先前的运行挂起或者什么,那么我最好的方法是检测这个并跳过当前的运行?
此外,是否有办法从新的运行中杀死以前的运行?或者我必须等到3分钟计时器用完?
谢谢!
答案 0 :(得分:1)
是的,在您的扩展GcmTaskService的服务中,您必须使用强制setTag()方法在“任务”构建器中设置标记,无论它是单任务还是周期性任务。 现在根据官方文件,Tag是:
此任务的字符串标识符。对同一标记的连续调度调用将使用相同的标记更新任何预先存在的任务。
因此,如果您的onRunTask()方法需要5秒钟才能完成,并且您正在安排服务以1秒开始,使用相同的标记,那么它将被更新。 请参阅:https://developers.google.com/android/reference/com/google/android/gms/gcm/OneoffTask.Builder.html#inherited-field-summary
您可以做的是使onRunTask()方法线程安全。根据: https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmTaskService
请记住,您的服务可能会立即从调度程序接收多个调用(特别是如果您已经生成多个重叠的调度请求)。如果是这种情况,onRunTask(com.google.android.gms.gcm.TaskParams)的实现必须是线程安全的。
但与您提到的情况一样,可能不会发生重叠。但是如果你想确定它,那么你可以做的是使用某种锁,当任务执行时启用它并将你的逻辑置于检查锁状态的状态。
现在,当您根据逻辑执行任务时,将获取锁定,因此条件将失败。并且onRunTask()将返回而不执行您的任务。任务完成后,释放锁定,当定期服务再次运行时,条件为真,您的任务将再次运行。
我希望这能解决你的疑问。