Android JobScheduler onStartJob называется несколько раз

JobScheduler вызывает onStartJob() несколько раз, хотя задание завершено. Все работает нормально, если я планирую одно задание и жду, пока оно не закончится. Однако, если я планирую два или более задания с разными идентификаторами одновременно, то onStartJob() вызывается снова после вызова jobFinished() .

Например, я планирую задание 1 и задание 2 с точно такими же параметрами, кроме ID, тогда порядок:

  1. onStartJob() для задания 1 и задания 2
  2. Оба задания завершаются, поэтому jobFinished() вызывается для обоих из них
  3. После этого onStartJob() вызывается снова для обоих заданий с тем же идентификатором

Моя работа очень проста и не сложна.

 public class MyJobService extends JobService { @Override public boolean onStartJob(final JobParameters params) { new Thread(new Runnable() { @Override public void run() { try { // do something } finally { // do not reschedule jobFinished(params, false); } } }).start(); // yes, job running in the background return true; } @Override public boolean onStopJob(JobParameters params) { // mark my background task as stopped // do not reschedule return false; } } 

Я планирую такие задания, как это

 JobInfo jobInfo = createBaseBuilder(request) .setMinimumLatency(2_000L) .setOverrideDeadline(4_000L) .setRequiresCharging(false) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .build(); int scheduleResult = mJobScheduler.schedule(jobInfo); // is always success 

Я не знаю, что случилось.

Solutions Collecting From Web of "Android JobScheduler onStartJob называется несколько раз"

Я предполагаю, что это вызвано ожидающим Job, поэтому я вызываю mJobScheduler.cancelAll () после запуска службы, проблема решена.

Я думаю, что это связано с сообщенной здесь ошибкой Android, которая, по-видимому, исправлена ​​для Android N, но будет присутствовать в более ранних версиях.

OP использует setOverrideDeadline() . Мое понимание проблемы, о которой сообщалось в связанном сообщении выше, заключается в том, что если задание выполняется, когда срабатывает крайний крайний срок, это заставляет задание планировать снова запустить.

Поэтому совет должен гарантировать, что переопределение срабатывает либо до запланированного задания (не уверен, как это достигается), либо после его завершения. Ни один из них не кажется особенно удовлетворительным, но, по крайней мере, он, по-видимому, исправлен в Android N.

Это проблема в android lollypop и Marshmallow. Это зафиксировано в Нуге, как объяснил Мэтью Уильямс здесь