Firebase jobdispatcher does not start on specified window

I am using Firebase Jobdispatcher with response time set between 10 and 20 seconds. This is my code to schedule the job:

public static void scheduleCompatibleJob(Context context) {
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
    Job myJob = dispatcher.newJobBuilder()
            .setService(DataTrackerJobService.class) // the JobService that will be called
            .setTag("api_trigger")
            .setRecurring(true)
            .setLifetime(Lifetime.FOREVER)
            .setTrigger(Trigger.executionWindow(10, 20)) // 10 to 20 seconds
            .setReplaceCurrent(true)
            .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .build();

    dispatcher.mustSchedule(myJob);
}

      

And the service class:

public class DataTrackerJobService extends JobService {
@Override
public boolean onStartJob(final JobParameters job) {
    Log.e("start job", "started " + job);
    (new Handler()).postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.e("handler", "run");
            jobFinished(job, true);
        }
    }, 2000);
    return true;
}

@Override
public boolean onStopJob(JobParameters job) {
    Log.e("stop job", "stopped " + job);
    return false;
}

      

}

The dispatcher has started, but the time in logcat is incorrect. With each rescheduling of work, the time period continues to increase and is never between 10 and 20 seconds.

06-07 11:19: 16.429 26174-26174 / com.example.jobdispatcher E / start: started com.firebase.jobdispatcher.JobInvocation@f4250de4 06-07 11:19: 18.432 26174-26174 / com.example.jobdispatcher E / handler: start 06-07 11: 20: 16.436 26174-26174 / com.example.jobdispatcher E / start: started com.firebase.jobdispatcher.JobInvocation@f16ceb31 06-07 11: 20: 18.438 26174-26174 / com. example.jobdispatcher E / handler: start 06-07 11: 21: 58.519 26174-26174 / com.example.jobdispatcher E / start: started com.firebase.jobdispatcher.JobInvocation@f4c635cd 06-07 11: 22: 00.520 26174- 26174 / com.example.jobdispatcher E / handler: start 06-07 11: 23: 40.602 26174-26174 / com.example.jobdispatcher E / start: startedcom.firebase.jobdispatcher.JobInvocation@f15f8e29 06-07 11: 23: 42.605 26174-26174 / com.example.jobdispatcher E / handler: run 06-07 11: 25: 52.642 26174-26174 / com.example.jobdispatcher E / get started: started com.firebase.jobdispatcher.JobInvocation@f48c1045 06-07 11: 25: 54.644 26174-26174 / com.example.jobdispatcher E / handler: run 06-07 11: 28: 52.652 26174-26174 / com.example .jobdispatcher E / start: started com.firebase.jobdispatcher.JobInvocation@f3b49821 06-07 11: 28: 54.655 26174-26174 / com.example.jobdispatcher E / handler: start 06-07 11: 32: 04.688 26174-26174 /com.example.jobdispatcher E / get started: com.firebase.jobdispatcher.JobInvocation@e7f3c1bd started 06-07 11: 32: 06.690 26174-26174 / com.example.jobdispatcher E / handler: run

Please check the time in logcat. Guide me where am I going wrong with this, or is it supposed to work this way? Basically, I want to implement it for a time span of 24 hours, but I am wondering if this will work, and then one job will be called after twice the time specified in the trigger time.

+3


source to share


1 answer


If you look at the source of the Trigger class, you will notice that you are not sure if your work will run at a specific time.

/**
 * Creates a new ExecutionWindow based on the provided time interval.
 *
 * @param windowStart The earliest time (in seconds) the job should be
 *                    considered eligible to run. Calculated from when the
 *                    job was scheduled (for new jobs) or last run (for
 *                    recurring jobs).
 * @param windowEnd   The latest time (in seconds) the job should be run in
 *                    an ideal world. Calculated in the same way as
 *                    {@code windowStart}.
 * @throws IllegalArgumentException if the provided parameters are too
 *                                  restrictive.
 */
public static JobTrigger.ExecutionWindowTrigger executionWindow(int windowStart, int windowEnd) {
    if (windowStart < 0) {
        throw new IllegalArgumentException("Window start can't be less than 0");
    } else if (windowEnd < windowStart) {
        throw new IllegalArgumentException("Window end can't be less than window start");
    }

    return new JobTrigger.ExecutionWindowTrigger(windowStart, windowEnd);
}

      

You should also notice that the next repetitive job only starts when the previous one is finished. So when your work is long and costly, the next run time might be unexpected. For time consuming tasks, you should extend SimpleJobService.

To create a recurring task, I use the util method, which creates the correct trigger:



public class JobDispatcherUtils {
    public JobTrigger periodicTrigger(int frequency, int tolerance) {
        return Trigger.executionWindow(frequency - tolerance, frequency);
    }
}

      

Using:

class DataTrackerJobService extends SimpleJobService {
    // ...
}

public static void scheduleCompatibleJob(Context context) {
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
    Job myJob = dispatcher.newJobBuilder()
            .setService(DataTrackerJobService.class) // the JobService that will be called
            .setTag("api_trigger")
            .setRecurring(true)
            .setLifetime(Lifetime.FOREVER)
            .setTrigger(JobDispatcherUtils.periodicTrigger(20, 1)) // repeated every 20 seconds with 1 second of tollerance
            .setReplaceCurrent(true)
            .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .build();

    dispatcher.mustSchedule(myJob);
}

      

+6


source







All Articles