Android JobScheduler总是工作1分钟

11

我正在尝试使用新的JobScheduler(由tatarka提供的兼容库)实现后台刷新服务。以下是我的代码:

@Override
public boolean onStartJob(JobParameters params) {
    Timber.i("on start job: " + params.getJobId());
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    Timber.i("on stop job: " + params.getJobId());
    return true;
}

这是我的工作信息

public void scheduleJob(View v) {
    JobInfo job = new JobInfo.Builder(kJobId++ /*jobid*/, new ComponentName(getActivity(), RefreshJobService.class))
            .setPeriodic(2000)
            .build();
    mTestService.scheduleJob(job);
}

在日志中我发现我的作业总是每分钟工作一次:

12-31 12:38:03.884 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:39:03.891 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:40:03.911 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:42:08.841 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:43:08.858 10059-10059/@/RefreshJobService﹕ on stop job: 0

那为什么呢?我将周期设置为 2000 毫秒,但任何值都不影响作业的每分钟间隔。为什么?


2
你知道这是为什么吗? - Papajohn000
@Papajohn000 不,我没有。 - onCreate
1
我不知道它是否仍然相关,但作业调度程序可能有最小时间限制。我知道闹钟管理器有2分钟的最小限制。 - Papajohn000
JobScheduler并不适用于如此短的时间间隔,它更适合在几个小时内刷新某些内容。在您的应用程序中,应该使用Handler.postDelayed或类似方法来实现。 - Dan Hulme
5个回答

8

onStopJob会在系统想要取消你的工作时被调用。它取消你的工作的原因是因为它认为你的工作还在运行中。你需要在工作的某个时间点调用jobFinished(params, bool)来告诉计划程序它已经完成,否则它会超时并调用onStopJob来取消它。此外,从onStartJob返回'true'告诉系统你还没有完成处理。除非你仍在做额外的工作,例如将工作传递给单独的线程,否则应该返回“false”。

@Override
public boolean onStartJob(JobParameters params) {
    Timber.i("on start job: " + params.getJobId());
    jobFinished(params, false);
    return false;
}

8

在 Android 5.1.1 之前,单个作业的超时时间为 60 秒。从 Android 6 开始,超时时间现在为 10 分钟。


7

从API 26(奥利奥)开始,为周期性任务设置小于15分钟的时间段将在至少15分钟后执行。


3

看起来你是在问为什么在你的任务启动后一分钟恰好会收到onStopJob的通知。

这个1分钟的超时时间在代码这里中定义。


0

43matthew说得没错,但我想再补充一些内容。你所说的2000毫秒是指工作重新开始执行的周期间隔,即每2000毫秒执行一次此任务,而不是任务执行的时间间隔。


我不认为这是正确的;Android只保证它在每个2000ms间隔内“至多运行一次”。这意味着(a)它是一个间隔,(b)它可能在此期间根本不执行您的作业。 - Tom

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