我试图在gcmnetworkmanager工具中了解一个offtask的settag和setupdatecurrent的行为。
The documentation of setUpdateCurrent说:
可选的setter,指定此任务是否应重写具有相同标记的任何先前存在的任务。默认为false,这意味着新任务不会覆盖现有任务。
很公平,但它并没有说任务会发生什么,它只说了一件不会发生的事情——即任务不会被覆盖。:)我不清楚使用setupdatecurrent是否意味着允许重复的任务,它是否意味着它们被丢弃?
为了清楚起见,我的问题是:如果您使用了setupdatecurrent(false),那么当您使用与另一个已调度的oneofftask相同的标记创建一个oneofftask时,新任务是否仍会在已调度的任务之外发生,或者新任务是否会被丢弃,作为复制品?
最佳答案
如果使用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)
一个任务也将保留计划,但正如预期的那样,它将是新任务。最后,如果使用不同的标记指定任务并对其进行调度,则任务计数将变为两个,并且两个任务都将挂起,这也是预期的。