Android Как запланировать задачу на каждую ночь с API JobDispatcher?

мне нужно загружать ответ json с веб-сервера каждую ночь, ранее я использовал AlarmManager для планирования задач, но я думаю, что для такой ситуации JobDispatcher великолепен, потому что он автоматически выполняет задачу, если сеть доступна, поэтому мне не нужно управлять такими вещами. Но я нашел много примеров JobDispatcher и JobScheduler во всех них. простая работа запланирована или запланирована с некоторой задержкой, но нет ничего, относящегося к моим требованиям, если кто-то имеет представление об этом, пожалуйста, помогите или предоставьте любую ссылку, связанную с этим, это будет очень полезно.

ОБНОВЛЕНИЕ

1. Как заставить это работать каждую ночь, потому что в настоящее время будильник устанавливается только на полночь один раз, как сделать, чтобы он повторялся каждую ночь в одно и то же время?


person Kulwinder Singh Rahal    schedule 23.08.2017    source источник
comment
используя AlarmManager, если ваше приложение будет убито, оно также отключит будильник на некоторых телефонах.   -  person phpdroid    schedule 24.08.2017
comment
У @phpdroid AlarmManager есть некоторые проблемы, поэтому я использую JobDispatcher   -  person Kulwinder Singh Rahal    schedule 24.08.2017
comment
@KulwinderSinghRahal Вы решили? если да то отпишитесь.   -  person Devendra Singh    schedule 14.03.2019


Ответы (2)


Вот как вам нужно планировать работу на основе времени

FirebaseJobDispatcher jobDispatcher = new FirebaseJobDispatcher(
                new GooglePlayDriver(this));

Calendar now = Calendar.getInstance();
Calendar midNight = Calendar.getInstance();
midNight.set(Calendar.HOUR, 12);
midNight.set(Calendar.MINUTE, 0);
midNight.set(Calendar.SECOND, 0);
midNight.set(Calendar.MILLISECOND, 0);
midNight.set(Calendar.AM_PM, Calendar.AM);

long diff = now.getTimeInMillis() - midNight.getTimeInMillis();

if (diff < 0) {
    midNight.add(Calendar.DAY_OF_MONTH, 1);
    diff = midNight.getTimeInMillis() - now.getTimeInMillis();
}

int startSeconds = (int) (diff / 1000); // tell the start seconds
int endSencods = startSeconds + 300; // within Five minutes 

Job networkJob = jobDispatcher.newJobBuilder()
        .setService(NetworkJob.class)
        .setTag(NetworkJob.ID_TAG)
        .setRecurring(true)
        .setTrigger(Trigger.executionWindow(startSeconds, endSencods))
        .setLifetime(Lifetime.FOREVER)
        .setReplaceCurrent(true)
        .setConstraints(Constraint.ON_ANY_NETWORK)
        .build();

jobDispatcher.schedule(networkJob);
person VinayagaSundar    schedule 24.08.2017
comment
спасибо за помощь, но я знаю об этом, мой вопрос заключается в том, как запланировать выполнение этой задачи каждую ночь после 12 часов ночи. - person Kulwinder Singh Rahal; 24.08.2017
comment
@KulwinderSinghRahal Назначение планировщика заданий или диспетчера заданий — запуск на основе ограничений, а не операций, основанных на времени. Тем не менее вы используете setTrigger() для определения времени. - person VinayagaSundar; 24.08.2017
comment
да, тогда какое значение я должен установить в setTrigger, чтобы установить работу на каждую ночь, это мой актуальный вопрос - person Kulwinder Singh Rahal; 24.08.2017
comment
@KulwinderSinghRahal обновите ответ, чтобы он соответствовал вашим требованиям. - person VinayagaSundar; 24.08.2017
comment
Я думаю, что это сработает, если я не ошибаюсь, нам нужно установить midNight.set(Calendar.AM_PM, Calendar.PM); на midNight.set(Calendar.AM_PM, Calendar.AM); - person Kulwinder Singh Rahal; 24.08.2017
comment
О да, @KulwinderSinghRahal, вы правы, это только утро. - person VinayagaSundar; 24.08.2017
comment
Я хочу знать, что произойдет, если устройство не будет подключено к сети (Интернету) во время (00:00). Ожидает ли устройство подключения к сети, если да, то сколько времени оно будет ждать? сеть очень важна, потому что я должен выполнять задачу в сети - person Kulwinder Singh Rahal; 24.08.2017
comment
он выдает Caused by: java.lang.IllegalArgumentException: Window start can't be less than 0 при планировании задачи, я установил через 15 минут в экземпляре календаря - person Kulwinder Singh Rahal; 24.08.2017
comment
Давайте продолжим это обсуждение в чате. - person VinayagaSundar; 24.08.2017
comment
эй, я обновил свой вопрос, любая помощь по этому поводу - person Kulwinder Singh Rahal; 11.10.2017
comment
Вам нужно учитывать дату с помощью приведенной выше логики. - person VinayagaSundar; 11.10.2017
comment
спасибо, это сработает, но как насчет проблемы номер 1, которую я разместил в вопросе, пожалуйста, помогите мне в этом, тогда я смогу принять ответ - person Kulwinder Singh Rahal; 11.10.2017
comment
не могли бы вы указать, что нужно ввести в endWindow, потому что, когда я ввожу, например: 200, он перезапускает службу через 200 секунд, но я хочу, чтобы служба перезапустилась следующей ночью в то же время - person Kulwinder Singh Rahal; 13.10.2017
comment
Вам нужно заново создать службу. Так что не создавайте рекурсивный сервис - person VinayagaSundar; 13.10.2017
comment
что я должен сделать, чтобы сделать службу нерекурсивной и где снова запустить службу, пожалуйста, обновите ответ, если хотите, а также это будет полезно для других в будущем - person Kulwinder Singh Rahal; 13.10.2017

Я предлагаю вам настроить JobDispatcher на запуск в следующую полночь, т.е. установить время начала как разницу между сегодняшней и следующей полуночью. После запуска вы можете позволить ему запустить новое задание, которое начнется через 24 часа, т. е. служба запустит новое задание со временем начала, установленным как 24 часа, и сделает его повторяющимся.

person Ziad AbouWasa    schedule 03.11.2018