我正试图围绕GcmNetworkManager工具中的setTag和OneoffTask的setUpdateCurrent的行为。
The documentation of setUpdateCurrent说:
可选的setter,用于指定此任务是否应覆盖具有相同标记的任何预先存在的任务。默认为false,这意味着新任务不会覆盖现有任务。
很公平,但它并没有说明任务会发生什么,它只会说不会发生一件事 - 即任务不会被覆盖。 :)我不清楚是否使用setUpdateCurrent意味着允许重复任务意味着它们被丢弃?
要明确,我的问题是这样的:鉴于你使用了setUpdateCurrent(false),当你创建一个OneoffTask,其标签与已经安排的另一个OneoffTask相同时,新任务仍然是除了已经安排的那个之外发生了什么,或者新任务是否会被丢弃,被视为重复?
答案 0 :(得分:9)
假设您使用了setUpdateCurrent(false),则在创建时使用 OneoffTask与另一个OneoffTask具有相同的标签 预定,除了已经完成的新任务还会发生 预定的一个,或将新的任务扔掉,被解雇为 重复?
新任务被丢弃,从未安排过。我对此感到惊讶,并且肯定觉得文档应该如此说明。
事实证明,您可以使用以下命令自行测试:
adb shell dumpsys activity service GcmService --endpoints YourGcmTaskServiceClassName
这使您可以查看等待的任务数量。在您的代码中调用GcmNetworkManager.getInstance(this).schedule(task)
之后,您的包的任务数将立即在adb命令的输出中递增:
Tasks count by package:
com.mypackage: 1
在其下方是显示待处理任务的区域:
Pending:
(scheduled) endpoint='com.mypackage/com.mypackage.YourGcmTaskServiceClassName'
tag='testing' : [PENDING] u0
Next execution: [early=17s, expires=37s]
Not yet run.
现在,如果您尝试使用setUpdateCurrent(false)
安排另一个任务并且与当前待处理的任务相同的标记,您会注意到下次运行adb命令时,只有一个任务仍处于待处理状态,这是第一个你安排的任务。
如果指定setUpdateCurrent(true)
,一个任务也会保持计划,但正如预期的那样,它将成为新任务。
最后,如果您指定具有不同标记的任务并安排它们,则任务计数将变为两个,并且两个任务都将处于待处理状态,这也是预期的。