11

新しいJobScheduler(compat by 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;
}

ここに私のJobInfoがあります

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

ログを見ると、私のジョブは常に 1 分間動作することがわかります 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 ミリ秒に設定されていますが、どの値もジョブの 1 分間隔には影響しません。なんで?

4

5 に答える 5

8

onStopJobシステムがジョブをキャンセルしたいときに呼び出されます。ジョブをキャンセルする理由は、ジョブがまだ実行中であると考えているためです。ジョブのある時点で呼び出しjobFinished(params, bool)て、スケジューラーに完了したことを伝える必要があります。そうしないと、タイムアウトになり、呼び出しonStopJobてキャンセルされます。さらに、から「true」を返すonStartJobと、処理が完了していないことがシステムに通知されます。まだ追加の作業を行っていない限り、「false」を返す必要があります。作業を別のスレッドに渡します。

@Override
public boolean onStartJob(JobParameters params) {
    Timber.i("on start job: " + params.getJobId());
    jobFinished(params, false);
    return false;
}
于 2016-06-01T20:58:35.470 に答える
8

Android 5.1.1 までは、1 つのジョブに 60 秒のタイムアウトがありました。Android 6 以降、タイムアウトは 10 分になりました。

于 2016-03-15T07:29:51.120 に答える
6

API 26 (Oreo) から、定期ジョブに 15 分未満の期間を設定すると、少なくとも 15 分後に実行されます。

于 2017-11-24T12:04:42.147 に答える
0

43matthew は正しいですが、これにさらに何かを追加したいと思います。あなたが話している 2000 ミリ秒は、ジョブが再び開始された後の定期的な間隔です。つまり、このジョブは 2000 ミリ秒ごとに実行され、ジョブが実行される間隔ではありません。

于 2016-02-02T07:24:56.357 に答える