Планирование заданий с помощью JobScheduler в Android

У меня проблема с расписанием заданий с помощью JobScheduler в новом Android API 21. Это код, в котором я планирую задание с интервалом в 60 секунд, как показано ниже:

ComponentName serviceName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(0, serviceName)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPeriodic(60000)
        .build();

Мой JobService печатает только время выполнения в Logcat, но журнал показывает, что служба запускается в эти моменты:

03-18 08:37:26.334: I/JOB(32662): Wed Mar 18 08:37:26 BRT 2015
03-18 08:37:56.364: I/JOB(32662): Wed Mar 18 08:37:56 BRT 2015
03-18 08:39:21.418: I/JOB(32662): Wed Mar 18 08:39:21 BRT 2015
03-18 08:41:51.670: I/JOB(32662): Wed Mar 18 08:41:51 BRT 2015
03-18 08:45:52.192: I/JOB(32662): Wed Mar 18 08:45:52 BRT 2015
03-18 08:54:20.678: I/JOB(32662): Wed Mar 18 08:54:20 BRT 2015

Это странно, потому что задание должно выполняться как минимум 1 раз в течение 1 минуты, как я установил с помощью метода setPeriodic(60000). Также любопытно, как увеличивается интервал между прогонами. На данный момент время — среда, 18 марта, 09:09:00 BRT 2015, и работа больше не выполняется.

Это проблема с API JobScheduler? (Я использую Nexus 5 с Android 5.0.1)


person lucasb.aquino    schedule 18.03.2015    source источник


Ответы (3)


Изменение времени связано с критериями отсрочки для повторных попыток выполнения заданий. По умолчанию установлено экспоненциальное. Я предполагаю, что вы также неправильно завершили свою работу, когда закончили с ней, позвонив jobFinished(JobParameters params, boolean needsReschedule).

Я написал сообщение в блоге, по всем мелочам с JobScheduler. Я настоятельно рекомендую прочитать это.

person MinceMan    schedule 13.04.2015
comment
Планировщик заданий работает отлично, но если я заблокирую экран, временной интервал постоянно меняется, любое решение для этого, которое работает для меня - person Jaichander; 11.06.2018
comment
Одна вещь, с которой планировщик заданий не справляется, — это обеспечение точного времени выполнения вашего задания. Я думаю, что это будет случай работы, как задумано. Однако, поиграв с вашими параметрами, вы сможете это исправить. Технически теперь вместо этого следует использовать WorkManager. Пару недель назад об этом был разговор с Google IO. youtube.com/watch?v=IrKoBFLwTN0 developer.android.com/reference/kotlin/androidx/work/ - person MinceMan; 12.06.2018
comment
Я пробовал это, проблема заключается в том, что диспетчер работ допускает периодические задания с интервалом в 15 минут, я должен запускать задание каждые 60 секунд любым другим способом, которым я мог бы достичь результата с точным временным интервалом, я разместил вопрос, не могли бы вы рассказать, как это сделать это без временной задержки «Android, у меня возникла проблема при настройке периодического интервала timertask, когда приложение»> stackoverflow.com/questions/50753823/ - person Jaichander; 13.06.2018

У меня была такая же проблема, и я думаю, что это может быть связано с внутренними требованиями класса JobInfo:

Исходный код для JobInfo

    /* Minimum interval for a periodic job, in milliseconds. */
private static final long MIN_PERIOD_MILLIS = 15 * 60 * 1000L;   // 15 minutes

Похоже, JobInfo не позволит вам установить интервал меньше этого.

person Mateusz Wlodarczyk    schedule 28.01.2017

//Ниже приведен код, который я использую в одном из своих проектов, и у меня он работает нормально.

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public void scheduleJob(Context context) {
        //https://kb.sos-berlin.com/pages/viewpage.action?pageId=3638048
        //Scheduler uses UTC times for all its internal operations. This ensures a continual flow of operation without breaks or repetitions regardless of any changes in local time.
        JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(context, MyService.class));//JobSchedulerService.class.getName()));
        builder.setPersisted(true); //persist across device reboots

        builder.setPeriodic((120 * 60 * 1000)); //run once after 2 hours seconds

        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // only if wifi avaiblable so they are not using bandwith
        builder.setRequiresDeviceIdle(false); // run not only if the device is idle
        builder.setRequiresCharging(false); // run not only if the device is charging

       // android.os.PersistableBundle bundle = new android.os.PersistableBundle();
        // bundle.putString(WEB_SERVICE_URL, "http://example.com?upload.php");
        //   builder.setExtras(bundle);

        //builder.setBackoffCriteria(1600, JobInfo.BACKOFF_POLICY_LINEAR);
        //BACKOFF_POLICY_LINEAR After one failure retry at 1 * your value, then at 2 * (your value), then 3 * (your value) and so on
        //BACKOFF_POLICY_EXPONENTIAL After one failure retry at your value, then at (your value)^2, (your value)^3 and so on
        //builder.setMinimumLatency(5 * 1000); //latency
        //builder.setOverrideDeadline(50 * 1000); //wait for criteria to be met, in 50 seconds if they have not then run anyways


        int test = jobScheduler.schedule(builder.build());
        if (test <= 0) {
            Utility.showDialog(context, "Service Error", "Service is not responding");
            //If something goes wrong
        }
    }

Мы определили класс обслуживания в соответствии с инструкциями ниже:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class MyService extends JobService {

    @Override
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public boolean onStartJob(final JobParameters params) {

        Log.e(TAG, "onStartJob");

        String month = "3";
        String year = "2018";           
MyAsync myAsync = new MyAsync(MyService.this, arraydata, month, year, new SyncAsyncListener() {
                    @Override
                    public void onDataSuccess() {
                        try {
                            jobFinished(params, result);
                        } catch (Exception e) {

                        }
                    }
                });

                myAsync.execute();
            }
    return result;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
    return false;
}
}
person JoboFive    schedule 31.03.2018