使用setPeriodic()时,Android JobScheduler运行得太频繁了。

13
我注意到我的计划任务调度程序执行任务的频率太高了。我已将其设置为每天执行,需要处于空闲状态、在 WLAN 上并充电,但是当满足这些条件时,该作业会执行得像是每 10 分钟或者更频繁。
我的代码:

I noticed my scheduled JobScheduler is executing the job way too often. I have it set to execute daily and it requires to be idle, to be on wlan and to be charging, but when those conditions are met the job executes like every 10min or even more frequently.

My code:

JobInfo.Builder builder = new JobInfo.Builder(1,
                    new ComponentName(context.getPackageName(), SyncJobService.class.getName()));


builder.setPeriodic(TimeUnit.DAYS.toMillis(1))
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setRequiresCharging(true)
        .setRequiresDeviceIdle(true);

int code = jobScheduler.schedule(builder.build());
if (code <= 0) {
    Log.e(TAG, "Could not scheduled job: " + code);
    return;
}

Log.e(TAG, "Scheduled job");

该工作在后台线程中执行下载互联网数据的任务,当数据下载完成后我调用

mService.jobFinished(mParams, true);

通知作业调度程序作业已完成并应重新安排作业。即使将周期设置为一天,作业为什么执行得如此频繁?由于作业运行得如此之频繁,我的Android 6.0.1设备几乎从不进入沉睡模式。

1个回答

20
数据下载完成后,我调用mService.jobFinished(mParams, true); 来通知作业调度器任务已经完成,并且应该重新安排它。这里就出现了问题。请使用false而不是truefalse表示“此任务的工作已完成”,true表示“我们遇到了问题,请重新安排此任务以便尽快完成”。例如,标准要求您拥有互联网连接,但您可能无法连接到服务器。在这种情况下,返回true,希望问题很快能够解决。
对于那些确实需要返回true的情况,您还可以考虑通过 setBackoffCriteria() 调整退避规则。

2
哦,这解释了我遇到的问题。看来我误解了文档。谢谢! - qwertz
这种情况下文档明显不准确。我也刚好遇到了同样的问题。 - davee44

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