有了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
相同的标签同时运行。