it-swarm.com.ru

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

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

Например, я планирую задание 1 и задание 2 с одинаковыми параметрами, кроме идентификатора, тогда порядок будет следующим:

  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

Я не знаю что не так.

15
vRallev

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

4
Xande

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

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

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

3
drmrbrewer

это проблема в Android леденце и зефире. Это исправлено в Nougat, как объяснил Мэтью Уильямс здесь

1
Imran Khan Saifi