JobScheduler - 如何确定唯一的作业ID?

30

根据文档,每个uid必须有唯一的作业ID。
如果我使用第三方库也安排作业,这是否意味着我不能使用与他们相同的作业ID?如果是这样,我该如何避免这些冲突?

2个回答

15

如果我使用一个也会调度任务的第三方库,这是否意味着我不能使用与他们相同的任务ID?

是的。

那么,我如何避免这些冲突?

询问库的开发者他们使用哪些任务ID,或者这些任务ID是否可以以某种方式进行配置。


1
有没有更可行的解决方案?如果使用JobScheduler(现在已成为强制性要求)需要我与我使用的每个第三方库进行通信并遵循它们的更新,那么这听起来像是一个严重的设计缺陷... - Ori Wasserman
1
@OriWasserman:"是否有一个更可行的解决方案?"--不要使用进而使用 JobScheduler 的第三方库,也不要提供详细信息或可配置性。"现在变得强制性" --我会描述为“更重要”。"那么听起来像是一个严重的设计缺陷" --正确。但是根据定义,没有办法生成一个不能被其他东西生成的唯一数字。使用随机整数使你不太可能与某些东西发生冲突,但不太可能!=不可能。 - CommonsWare
@OriWasserman:他们特别建议不要使用由资源生成的值(例如,id资源),并说“您需要确保这是跨应用程序更新的稳定ID,因此可能不基于资源ID”。因此,没有系统提供的方法来确保您不会在作业ID上发生冲突。 - CommonsWare
1
@OriWasserman:您可以在JobScheduler上使用getAllPendingJobs()来查找已经使用的ID,以避免与它们发生冲突。但是,库可能不会这样做,并且存在竞争条件,因此这只有适度的好处。这并不能保证您使用的ID不会被库同时或稍后使用。 - CommonsWare
2
@OriWasserman:顺便说一句,我写了一篇关于这个主题的博客文章(https://commonsware.com/blog/2017/06/07/jobscheduler-job-ids-libraries.html)。感谢您指出这个问题! - CommonsWare
显示剩余2条评论

1
如果向库的开发者询问不起作用,您可能希望在包名称上计算md5并选择最后4个字节作为唯一标识符。碰撞的机会将会相当小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接