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

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

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

  • onStartJob() для задания 1 и задания 2
  • Оба задания завершаются, поэтому для них jobFinished() вызывается
  • После этого 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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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