Android JobScheduler работает слишком часто при использовании setPeriodic()

Я заметил, что мой запланированный JobScheduler выполняет работу слишком часто. Я установил его для ежедневного выполнения, и он требует простоя, быть на wlan и заряжаться, но когда эти условия выполнены, задание выполняется как каждые 10 минут или даже чаще.

мой код:

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 ответов


после загрузки данных я вызываю mService.jobFinished(mParams, true); чтобы уведомить Планировщик заданий о том, что задание выполнено и его следует перенести

это ваша проблема. Использовать false, а не true.

false говорит: "работа сделана для этой работы". true говорит:"У нас была проблема, пожалуйста, перенесите эту работу снова, чтобы это произошло скоро". Например, критерии говорят, что у вас должно быть подключение к Интернету, но, возможно, у вас есть сложность подключения к серверу. В таком случае, return true, в надежде, что проблема прояснится немного.

вы также можете рассмотреть возможность корректировки правил backoff via setBackoffCriteria() для тех случаев, когда вы действительно хотите вернуть true.