@zongwu
2017-01-05T07:58:16.000000Z
字数 1496
阅读 352
Job Configuration
技术交流
- Priority 越高越好。 下一个可用的作业消费者将首先获得最高优先级的作业。 (如果它准备运行)。 根据设计,仅存储器作业比持久作业具有更高的优先级。 如果两个作业具有相同的优先级,则首先排入队列的作业将首先运行。 (假设两者都准备运行)
- Network Requirement 如果将作业标记为需要网络,作业管理器将不会运行作业,直到设备具有网络连接。如果不需要网络,即使它们的优先级较低,也不会阻止其他作业运行。从V2开始,您还可以使用params#requireUnmeteredNetwork指定要计量的网络类型。 还可以为这些要求设置超时。 例如,您可以创建在第一天需要非计量网络的作业,然后回退到任何连接。
new Params(1)
.requireUnmeteredNetworkWithTimeout(TimeUnit.DAYS.toMillis(1))
.requireNetwork()
- Persistence 有时,确保作业运行非常重要,无论应用程序发生什么。 (崩溃等:))。 在这种情况下,您可以将作业标记为持久性,作业管理器将处理它。 如果您的应用程序由于某种原因崩溃或被操作系统杀死,下次重新打开时,作业管理器将尝试重新运行它。 这对于用户创建内容的任何应用都非常有用,以确保您的应用最终将用户的内容同步到服务器。
- Grouping 这是一个常见的用例,您不想并行运行某些作业。 例如,当多个作业编辑同一个对象时。 对于这种情况,您可以为这些作业分配相同的groupId,作业管理器将确保它们顺序运行(不同的作业类可能具有相同的id,它取决于作业实例,而不是类)。 一个很好的例子是消息传递客户端。 如果用户有一堆消息等待发送到不同的会话,您需要确保发送到同一个会话的消息是有序的。 同时,您可以并行发送消息到不同的会话。 通过将SendMessageJob的groupId设置为会话ID,很容易通过作业管理器解决。 在组内,优先级规则仍然适用。
- Delaying Jobs 有时你想在一段时间过后运行一个工作。 例如,您想要获取GCM令牌,并在应用程序启动时将其发送到您的服务器,但不希望它与您的更重要的请求争夺网络。 在这种情况下,您可以延迟相关作业,并且作业管理器将等待,直到它应该运行。 当准备运行时,其他规则仍然适用(网络要求等)重要信息:在V1中,JobManager用于在应用程序重新启动时重置此延迟。 在V2中,这不再是默认行为,但您仍然可以通过配置#resetDelaysOnRestart更改它。
- Retry Logic 如果作业在运行时抛出异常,作业管理器调用shouldReRunOnThrowable方法来决定是否应重新尝试或取消作业。 如果作业达到重试限制(默认为20),作业管理器将自动取消它,而不调用shouldReRunOnThrowable,但会调用onCancel方法。 您可以通过覆盖getRetryLimit方法覆盖每个作业的重试计数。
- Tags 创建作业时,您可以附加标签列表,这只是字符串。如果不再需要这些标签,则可以用于稍后取消作业。
- Single Instance Jobs 通常需要具有特定作业的单个实例,以便如果创建多个实例,则在给定时间只有1个队列在队列中运行/等待。 你可以通过params#singleInstanceBy实现。 当使用相同的单实例标记添加作业时,如果存在在队列中等待的现有作业,则在调用其onAdded方法后,新作业将立即被取消。 如果前一个作业已经在运行,则新作业将被添加,并且已经运行的作业将失败,如果完成没有错误,则不会发生任何事情。