1

有了GcmNetworkManager,我的理解是两个具有相同标签的任务永远不能同时运行。这是根据文档here

对于每个服务,具有相同标签的两个任务永远不会同时执行。如果在现有任务仍在运行时新计划的任务到达,则新任务将被丢弃。此外,不同的任务可以同时调度,如果它们的调度重叠,每个任务都在单独的线程中调用。在调度多个任务时确保线程安全由您决定。

我的问题是:

如果我们安排一个任务(a OneoffTask):

Task myTask = ... ;// create task of MY_TAG
gcmNetworkManager.schedule(myTask);

然后在稍后的某个时候我们取消它,但让我们假设它当前正在运行(它GcmTaskService:onRunTask仍在其线程上运行):

// Cancel task
// At this point GcmTaskService:onServiceRun could still be running (on a different thread)! 
// `GcmTaskService:onRunTask` will continue to run
gcmNetworkManager.cancelTask(MY_TAG, ..);

然后在稍后的另一个时间,我们重新安排相同的标签:

// Re-schedule task. 
// At this point GcmTaskService:onRunTask could still be running (on a different thread)! 
Task myTask = ... ;// create task of MY_TAG
gcmNetworkManager.schedule(myTask);

GcmTaskService:onRunTask重新安排的任务运行时,是否GcmNetworkManager仍然知道有一个任务正在运行(GcmTaskService::onRunTask()还没有返回?(注意此时它的标签被取消了)

或者它实际上是否因为它的标签被取消而开始一个新的GcmTaskService调用?GcmTakService:onRunTask这意味着实际上可能有两个GcmTaskService:onRunTask相同的标签同时运行。

4

0 回答 0