使用作业调度程序管理定期任务?

Posted

技术标签:

【中文标题】使用作业调度程序管理定期任务?【英文标题】:manage periodic tasks with job Scheduler? 【发布时间】:2017-07-15 20:19:33 【问题描述】:

基本上我想做的是,当有互联网连接时,然后从传感器收集值并安排下一次从传感器收集数据的时间,比如说 5 分钟(这个间隔取决于当前的活动:步行、跑步。 ..)。 5分钟后,系统会检查是否有网络连接:

-如果有则重复循环(收集,发送到服务器并安排下一次数据收集)

*如果没有,则下一次收集数据的时间安排在下一次有可用的互联网连接时

我尝试使用什么:

1) 我想为 api=21 使用作业调度程序。 对于作业调度程序,我无法同时设置需求可用网络并使作业定期进行,因为这样无论是否满足要求,作业都会在周期结束后运行。

2)我试图让作业服务在当前作业结束后设置下一个作业,但应用程序运行时好像该部分代码不存在(它只运行一次)

3) 我尝试以某种方式将作业调度器与警报管理器结合起来,以使作业调度器管理网络需求,而警报管理器管理作业的周期性方面。但我没有实现这一点,我觉得这不是正确的做法。

如果有人能指导我找到更好的方法来处理这个问题,我将不胜感激,因为我已经花了很长时间试图解决这个问题。

【问题讨论】:

【参考方案1】:

我会推荐一个名为 android-job 的 Evernote 库。它处理了在 21+、Firebase/GcmNetworkManager 或 AlarmManager 以及各种其他事情上选择 JobScheduler 的所有复杂性。它具有一组非常强大的功能,应该适合您的用例。

例如:

int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
        .setExecutionWindow(30_000L, 40_000L)
        .setBackoffCriteria(5_000L, JobRequest.BackoffPolicy.EXPONENTIAL)
        .setRequiresCharging(true)
        .setRequiresDeviceIdle(false)
        .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
        .setExtras(extras)
        .setRequirementsEnforced(true)
        .setPersisted(true)
        .setUpdateCurrent(true)
        .build()
        .schedule();

【讨论】:

帖子说“JobRequest.Builder 类有许多额外的选项,例如,您可以指定所需的网络连接、定期执行作业、通过捆绑传递一些额外内容、重启后恢复作业或在准确的时间运行这项工作。”这应该完全满足我的需要。非常感谢,我已经被这个问题困扰了好几天了。 @James McCracken,我的工作安排有问题,请帮帮我。 ***.com/questions/44063206/…

以上是关于使用作业调度程序管理定期任务?的主要内容,如果未能解决你的问题,请参考以下文章

管理 Hadoop 作业的工作流调度系统——Oozie

Windows 2008 服务器任务调度程序不运行 .bat 批处理作业 [关闭]

常见的嵌入式OS内存管理和进程调度方式

Centos进程作业管理与计划任务

linux计划任务 进程管理

Yarn三种调度策略对比