4

我试图围绕 GcmNetworkManager 工具中 OneoffTask 的 setTag 和 setUpdateCurrent 的行为。
setUpdateCurrent 的文档是这样说的:

可选设置器,用于指定此任务是否应覆盖具有相同标记的任何预先存在的任务。这默认为 false,这意味着新任务不会覆盖现有任务。

很公平,但它并没有说明任务会发生什么,它只说明了不会发生的一件事——即任务不会被覆盖。:) 我不清楚使用 setUpdateCurrent 是否意味着允许重复任务是否意味着它们被丢弃?

需要明确的是,我的问题是:鉴于您使用了 setUpdateCurrent(false),当您创建一个与已安排的另一个 OneoffTask 具有相同标签的 OneoffTask 时,除了已安排的任务之外,新任务是否仍会发生,或者新任务会被丢弃,作为重复任务被解雇吗?

4

1 回答 1

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)一项任务也保持计划,但正如预期的那样,它将是新任务。

最后,如果您指定具有不同标签的任务并安排它们,任务计数将变为两个,并且两个任务都将处于挂起状态,这也是预期的。

于 2016-02-13T21:21:52.023 回答