JobScheduler定期每10分钟运行一次。我必须做的是在应用运行后立即运行计划,并每10分钟保持定期运行。现在发生的事情是:安装应用程序后,需要10分钟才能运行计划。如何使其最初运行,然后每10分钟重复一次?我在onStartJob()中有用于将数据更新到服务器的代码。但是上传时间也从7分钟到25分钟。我想每10分钟上传一次数据,但它随机变化。这是为什么?

JobInfo jobInfo =
    new JobInfo.Builder(MYJOBID, jobService).setPeriodic(600000).
    setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).
    setRequiresCharging(false).
    setRequiresDeviceIdle(false).
    setPersisted(true).
    setExtras(bundle).
    build();

int jobId = jobScheduler.schedule(jobInfo);
if(jobScheduler.schedule(jobInfo)>0){
    Toast.makeText(LiveTrack.this,
            "Successfully scheduled job: " + jobId,
            Toast.LENGTH_SHORT).show();
}else{
    Toast.makeText(LiveTrack.this,
            "RESULT_FAILURE: " + jobId,
            Toast.LENGTH_SHORT).show();
}




public class MyJobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        new MyDownloadTask().execute();
        return false;
    }
}

最佳答案

我想每10分钟上传一次数据,但它随机变化。这是为什么?


JobScheduler API不保证以确切的间隔重复。


  但是上传时间也从7分钟到25分钟。


根据setPeriodic() reference


  您无法控制在此间隔内何时执行此作业,仅保证在此间隔内最多可以执行一次该作业。


尽管如此,我们应该最多相隔20分钟才能收到回调。让我们看一下JobInfo.Builder source code。从setPeriodic(long)开始:

 public Builder setPeriodic(long intervalMillis) {
        return setPeriodic(intervalMillis, intervalMillis);
 }


好吧,它称呼它为重表弟。其中说:


  指定该作业应以提供的间隔和弹性重复进行。周期结束时,作业可以在弹性长度窗口中的任何时间执行。


哇,所以在我们的情况下,弯曲长度也只有10分钟?没那么快:

/**
  * Specify that this job should recur with the provided interval and flex. The job can
  * execute at any time in a window of flex length at the end of the period.
  * @param intervalMillis Millisecond interval for which this job will repeat. A minimum
  *                       value of {@link #getMinPeriodMillis()} is enforced.
  * @param flexMillis Millisecond flex for this job. Flex is clamped to be at least
  *                   {@link #getMinFlexMillis()} or 5 percent of the period, whichever is
  *                   higher.
  */



  强制执行getMinPeriodMillis()的最小值。


:|

您要求的最短期限是多少?

MIN_PERIOD_MILLIS = 15 * 60 * 1000L; // 15 minutes

因此,您对setPeriodic(60000)的调用无济于事。最小时间限制为15分钟。

JobScheduler并不是真正用于精确的重复周期。实际上,之所以建立它,是因为大多数应用都在滥用AlarmManger API,而该API提供了这种(精确重复)功能。

关于android - JobScheduler问题android,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46293368/

10-10 16:11