2017-09-19 59 views
1

ジョブスケジューラは定期的に10分ごとに実行されます。私は、アプリケーションが実行されるとすぐにスケジュールを実行するために何をしなければならず、10分ごとに定期的に実行し続けます。今何が起こるのか:アプリをインストールした後、スケジュールを実行するのに10分かかります。それを最初に実行してから10分ごとに繰り返す方法私はonStartJob()でサーバーにデータを更新するコードを持っています。アップロード時間は7分から25分です。私は10分ごとにデータをアップロードしたいが、ランダムに変化する。何故ですか?JobScheduler issue android

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

答えて

1

私は、データごとに10分をアップロードしたいが、それはランダムに変化します。何故ですか?

JobScheduler APIは、正確な間隔で繰り返すことを約束しません。

アップロード時間は7分から25分です。 referencesetPeriodic()によると

あなたはこの間隔内にこのジョブが実行されるときを制御することはできません、それはこの間隔内で最も一度に実行されることのみを保証。

でも、20分ほどでコールバックを取得する必要があります。 JobInfo.Buildersource codeを見てみましょう。 setPeriodic(long)から開始:

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

[OK]を呼び出すと、オーバーロードされたいとこです。どのくらいですか:

このジョブは、指定された間隔で繰り返してフレックスするように指定します。このジョブは、期間の終了時にフレックス長さのウィンドウでいつでも実行できます。

私たちの場合はフレックス長さも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を悪用していたため作成されました。

+0

hi ..ansのおかげで。 onStop()メソッドには 'return false'ステートメントがあります。私はそれをtrueに設定すると、それは動作していません(つまり、データはサーバーで更新されません)。何故ですか? –

+0

@AmritaSthaお受け取りいただきありがとうございます。私はあなたが '' 'onStopJob()' 'を意味すると思います。 javadocを読むと、 '' onStartJob() ''が失敗する可能性が高いときに '' 'onStopJob()' 'が呼び出されたときに表示されます。 '' 'onStopJob()' ''から戻ってくるのは単純にrjobを再試行するかどうかをシステムに示しています。私はこれを別の質問と考えています。私はあなたに詳細について別の質問をすることをお勧めします。 – iceman

+0

申し訳ありませんが、onStartJob()... trueが返された場合、その中のコードは機能しません。 –