6

我已经阅读了所有可用的官方文档(令人惊讶的是不是很多),我能得到的定期任务就是这段代码

            .setRecurring(true)
            // start between 0 and 60 seconds from now
            .setTrigger(Trigger.executionWindow(0, 60))

我知道这.setRecurring使得作业具有周期性,并且trigger使它以 60 秒的间隔开始,但是第二次执行呢?这是否意味着第二次也将从第一次开始执行 60 秒?

这不可能是真的,因为即使考虑到后台活动的优化以及服务如何运行比他们应该的稍晚一点,编程 60 秒的周期而作业运行大约 5/10/20 分钟后太多了的区别。官方文档说差异是几秒钟,也许几分钟不超过 20 分钟。

基本上,我的问题是这 .setTrigger(Trigger.executionWindow(0, 60))真的意味着这个时间段是 60 秒还是我弄错了?

4

2 回答 2

6

当它是非周期性的。

.setRecurring(false)
.setTrigger(Trigger.executionWindow(x, y))  

此代码将在安排作业的x秒和安排作业的y秒之间运行我们的作业。

x被称为windowStart,这是作业应该被认为有资格运行的最早时间(以秒为单位)。从安排作业的时间开始计算(对于新作业)

y被称为windowEnd,作业应该在理想世界中运行的最晚时间(以秒为单位)。计算方式与windowStart相同。

当它是周期性的

.setRecurring(true)            
.setTrigger(Trigger.executionWindow(x, y))

此代码将在作业安排x秒和作业安排y秒之间运行我们的作业。由于这是周期性的,下一次执行将在作业完成后x秒安排。

也可以参考这个答案。

于 2017-05-03T08:42:15.820 回答
0

如果您在此处查看Trigger 类的来源会更清楚

它指出:

    /**
     * Creates a new ExecutionWindow based on the provided time interval.
     *
     * @param windowStart The earliest time (in seconds) the job should be
     *                    considered eligible to run. Calculated from when the
     *                    job was scheduled (for new jobs) or last run (for
     *                    recurring jobs).
     * @param windowEnd   The latest time (in seconds) the job should be run in
     *                    an ideal world. Calculated in the same way as
     *                    {@code windowStart}.
     * @throws IllegalArgumentException if the provided parameters are too
     *                                  restrictive.
     */
    public static JobTrigger.ExecutionWindowTrigger executionWindow(int windowStart, int windowEnd) {
        if (windowStart < 0) {
            throw new IllegalArgumentException("Window start can't be less than 0");
        } else if (windowEnd < windowStart) {
            throw new IllegalArgumentException("Window end can't be less than window start");
        }

        return new JobTrigger.ExecutionWindowTrigger(windowStart, windowEnd);
    }

或者只是 Ctrl+单击,Trigger然后 Android Studio 将带你到它的源代码。所以如果你写:.setTrigger(Trigger.executionWindow(0, 60))那么它将每秒钟运行一次

于 2017-03-24T07:27:39.630 回答