【问题标题】:JobScheduler issues androidJobScheduler 问题 android
【发布时间】:2017-09-19 06:29:28
【问题描述】:

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;
    }
}

【问题讨论】:

    标签: android android-jobscheduler


    【解决方案1】:

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

    JobScheduler API 不承诺以精确的间隔重复。

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

    根据setPeriodic()reference

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

    不过,我们应该最多相隔 20 分钟才能收到回电。让我们看看JobInfo.Buildersource 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。

    【讨论】:

    • 嗨..谢谢你的回答。 onStop() 方法中有一个“return false”语句。如果我将其设置为 true,则它不起作用(即数据未在服务器中更新)。这是为什么呢?
    • @AmritaStha 感谢您的接受。我想你的意思是onStopJob()。如果您阅读 javadoc,您会看到当您的 onStartJob() 可能会失败时调用 onStopJob()。从onStopJob() 返回只是简单地指示系统是否重试您的 rjob。我认为这本身就是一个单独的问题。我建议你再问一个详细的问题。
    • Sorry that was for onStartJob()... 如果返回 true,则其中的代码不起作用。
    • @AmritaStha 见meta.stackexchange.com/questions/39223/…。更多细节,代码会有所帮助。新问题的曝光度会更高,其他人可能会提供更好的答案。
    • 另外,如果您认为此答案正确且有用,请点赞:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多