Ответ 1
Я предполагаю, что это вызвано ожидающим заданием, поэтому я вызываю mJobScheduler.cancelAll() после запуска службы, проблема решена.
JobScheduler вызывает onStartJob()
несколько раз, хотя задание завершено. Все работает нормально, если я планирую одно задание и жду, пока оно не закончится. Однако, если я планирую два или более задания с разными идентификаторами одновременно, то onStartJob()
вызывается снова после вызова jobFinished()
.
Например, я планирую задание 1 и задание 2 с точно такими же параметрами, кроме ID, тогда порядок:
onStartJob()
для задания 1 и задания 2jobFinished()
вызывается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
Я не знаю, что случилось.
Я предполагаю, что это вызвано ожидающим заданием, поэтому я вызываю mJobScheduler.cancelAll() после запуска службы, проблема решена.
Я думаю, что это связано с ошибкой Android, сообщенной здесь, которая, по-видимому, была исправлена для Android N, но будет присутствовать в более ранних версиях.
OP использует setOverrideDeadline()
. Мое понимание проблемы, о которой сообщалось в связанном сообщении выше, заключается в том, что если задание выполняется при переполнении крайнего срока, оно заставляет выполнение задания снова запускаться.
Поэтому совет должен гарантировать, что переопределение срабатывает либо до того, как задание запланировано (не уверен, как это достигается), либо после его завершения. Ничего не кажется особенно удовлетворительным, но, по крайней мере, он, похоже, исправлен в Android N.
это проблема в android lollypop и Marshmallow. Это зафиксировано в Нуге, как объяснил Мэтью Уильямс здесь