Почему JobScheduler не работает должным образом - PullRequest
0 голосов
/ 20 июня 2019

Я использую JobScheduler для запуска задания каждые 15 минут.Но это не работает, как ожидалось.Здесь я приложил свой код.

public class WorkScheduler extends JobService {

    private static final String TAG = "Jobschedulerexample";
    private boolean jobCanceled = false;
    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

    @Override
    public boolean onStartJob(JobParameters jobParameters) {

        Log.d(TAG,"Started at ==> "+ sdf.format(new Date()));
        Log.d(TAG,"Job Started");
        doBackgroundWork(jobParameters);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {

        Log.d(TAG, "Job cancelled before completion");
        jobCanceled = true;
        return true;
    }

    private void doBackgroundWork(final JobParameters params) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 0; i < 10; i++) {
                    Log.d(TAG, "run: " + i);
                    if (jobCanceled) {
                        return;
                    }

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                Log.d(TAG, "Job finished");
                Log.d(TAG,"Ended at ==> "+ sdf.format(new Date()));
                jobFinished(params, true);
            }
        }).start();
    }
}

Мой служебный класс для Службы заданий

public class WorkSchedulerUtility {

    private static final int JOB_ID = 123;
    private static WorkSchedulerUtility mInstance;
    private final int REFRESH_INTERVAL = 15 * 60 * 1000;

    private WorkSchedulerUtility(){

    }

    public static WorkSchedulerUtility getInstance(){
        if(mInstance == null){
            mInstance = new WorkSchedulerUtility();
        }
        return mInstance;
    }

    private static final String TAG = "Jobschedulerexample";

    public void scheduleJob(Context context) {
        ComponentName componentName = new ComponentName(context, WorkScheduler.class);

       /* JobInfo info = new JobInfo.Builder(JOB_ID, componentName)
                .setPersisted(true)
                .setPeriodic(REFRESH_INTERVAL)
                .build();*/

        JobInfo info = new JobInfo.Builder(JOB_ID, componentName)
                .setPersisted(true)
                .setBackoffCriteria(REFRESH_INTERVAL, JobInfo.BACKOFF_POLICY_LINEAR)
                .setMinimumLatency(1000 * 6)
                .build();

        JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
        int resultCode = scheduler.schedule(info);
        if (resultCode == JobScheduler.RESULT_SUCCESS) {
            Log.d(TAG, "Job scheduled");
        } else {
            Log.d(TAG, "Job scheduling failed");
        }
    }

    public void cancelJob(Context context) {
        JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
        scheduler.cancel(123);
        Log.d(TAG, "Job cancelled");
    }

}

Я планировал запускать задание каждые 15 минут.Но это не начало работы каждые 15 минут.Я прикреплю вывод.

Начинается с ==> 15:10:49 Завершено с ==> 15:10:59 Начато с ==> 15:25:59 Завершено с ==>15:26:09 Начинается с ==> 15:56:10 Завершается на ==> 15:56:20 Начинается с ==> 16:41:44 Завершается на ==> 16: 41: 54

Я не знаю, почему это не работает каждые 15 минут.А также я хочу начать работу в определенное время.Например, каждый день в 8 часов.Как добиться этого с помощью JobSceduler.

1 Ответ

0 голосов
/ 20 июня 2019

JobScheduler не гарантирует запускать вашу работу каждые 15 минут, но когда сочтет нужным.См. этот ответ .

...