Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止gcmTaskService PeriodictTask在上一次未运行时再次运行';还没完成?_Java_Android - Fatal编程技术网

Java 如何防止gcmTaskService PeriodictTask在上一次未运行时再次运行';还没完成?

Java 如何防止gcmTaskService PeriodictTask在上一次未运行时再次运行';还没完成?,java,android,Java,Android,我设置了一个periodicTask,大约每60秒运行一次。运行只需一秒或两秒,因此不太可能发生任何重叠,但如果前一次运行挂起或发生其他情况,我最好的方法是什么来检测此情况并跳过当前运行 还有,有没有办法从新运行中删除上一运行?还是我必须等到3分钟的计时器用完 谢谢 是的,在扩展GcmTaskService的服务中,您必须使用强制的setTag()方法在Task builder中设置标记,无论是oneofftask还是定期任务。 现在根据官方文件,标签是: 此任务的字符串标识符。对同一标记的连续

我设置了一个periodicTask,大约每60秒运行一次。运行只需一秒或两秒,因此不太可能发生任何重叠,但如果前一次运行挂起或发生其他情况,我最好的方法是什么来检测此情况并跳过当前运行

还有,有没有办法从新运行中删除上一运行?还是我必须等到3分钟的计时器用完


谢谢

是的,在扩展GcmTaskService的服务中,您必须使用强制的setTag()方法在Task builder中设置标记,无论是oneofftask还是定期任务。 现在根据官方文件,标签是:

此任务的字符串标识符。对同一标记的连续调度调用将使用同一标记更新任何先前存在的任务

因此,如果您的onRunTask()方法需要5秒才能完成,并且您正在计划使用相同的标记在1秒内启动服务,那么它将被更新。 参考:

您可以做的是使onRunTask()方法线程安全。根据:

请记住,您的服务可能会同时收到来自调度程序的多个呼叫(特别是如果您发出了多个重叠的调度请求)。如果是这种情况,onRunTask(com.google.android.gms.gcm.TaskParams)的实现必须是线程安全的

但就像你提到的情况一样,可能不会发生重叠。但如果您想确保这一点,那么您可以使用某种类型的锁,当任务执行时会启用该锁,并将逻辑置于检查锁状态的条件下

现在,当您将根据逻辑执行任务时,将获取锁,因此条件将失败。并且onRunTask()将返回而不执行任务。任务完成后,释放锁,当服务定期再次运行时,条件将为true,任务将再次运行


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

您是否找到了使GcmTaskService线程安全的方法?能否提供makign onRunTask()线程安全的示例实现?非常感谢。