firebase jobdispatcher在指定的窗口中不触发



我正在实现firebase jobdispatcher,其触发时间在10到20秒之间指定。这是我安排工作的代码:

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);
}

和服务类:

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;
}

}

作业调度程序正在运行,但是LogCat中的时间不正确。随着工作的每一次重新安排,时间差距都在不断增加,并且在10到20秒内从未如此。

06-07 11:19:16.429 26174-26174/com.example.jobdispatcher e/start作业:开始com.firebase.jobdispatcher.jobinvocation@f4250de4 06-07 11:19:18.432 26174-26174/com.example.jobdispatcher E/Handler:运行 06-07 11:20:16.436 26174-26174/com.example.jobdispatcher e/start作业:开始com.firebase.jobdispatcher.jobinvocation@f16ceb31 06-07 11:20:18.438 26174-26174/com.example.jobdispatcher E/Handler:运行 06-07 11:21:58.519 26174-26174/com.example.jobdispatcher e/start作业:开始com.firebase.jobdispatcher.jobinvocation@f4c6355cd 06-07 11:22:00.520 26174-26174/com.example.jobdispatcher E/Handler:运行 06-07 11:23:40.602 26174-26174/com.example.jobdispatcher e/start作业:开始com.firebase.jobdispatcher.jobinvocation@f15f8e29 06-07 11:23:42.605 26174-26174/com.example.jobdispatcher E/Handler:运行 06-07 11:25:52.642 26174-26174/com.example.jobdispatcher e/start作业:开始com.firebase.jobdispatcher.jobinvocation@f48c1045 06-07 11:25:54.644 26174-26174/com.example.jobdispatcher E/Handler:运行 06-07 11:28:52.652 26174-26174/com.example.jobdispatcher e/start作业:开始com.firebase.jobdispatcher.jobinvocation@f3b49821 06-07 11:28:54.655 26174-26174/com.example.jobdispatcher E/Handler:运行 06-07 11:32:04.688 26174-26174/com.example.jobdispatcher e/start作业:开始com.firebase.jobdispatcher.jobinvocation @e7f3c1bd 06-07 11:32:06.690 26174-26174/com.example.jobdispatcher e/handler:run

请在logcat中检查时间。指导我在哪里出错,还是应该这样做?基本上,我想实现24小时的时间差距,但是我想知道这是否是工作的,然后在触发时间指定的时间加倍之后将调用工作。

如果您查看触发类的来源,您会注意到您不确定自己的作业是否会在给定时间运行。

/**
 * 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);
}

您还应注意,仅当上一个重复工作结束时,下一个重复的工作才开始。因此,当您的工作漫长而昂贵时,下一个执行时间可能是出乎意料的。对于耗时的工作,您应该扩展简单的Jobservice。

用于创建重复任务,我正在使用我的util方法创建适当的触发器:

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

用法:

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);
}

相关内容

  • 没有找到相关文章

最新更新