如何防止gcm任务服务周期任务再次运行,如果以前的任务还没有完成?



我设置了一个每60秒左右运行的周期性任务。运行应该只需要一秒钟或 2 秒,所以不太可能发生任何重叠,但是如果上一次运行挂起或其他什么,我检测这一点并跳过当前运行的最佳方法是什么?

另外,有没有办法从新运行中杀死以前的运行?还是我必须等到 3 分钟计时器用完?

谢谢!

是的,在扩展 GcmTaskService 的服务中,您必须使用强制性的 setTag() 方法,该方法在任务生成器中设置标签,无论是一次性任务还是定期任务。现在根据官方文件,标签是:

此任务的字符串标识符。对同一标签的连续计划调用将更新具有相同标签的任何预先存在的任务。

因此,如果您的 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() 将在不执行任务的情况下返回。任务完成后,释放锁,当定期服务再次运行时,条件将为真,任务将再次运行。

我希望这能解决你的疑问。

相关内容

最新更新