Firebase JobDispatcher:如何重新计划同一作业?

时间:2018-10-15 15:01:07

标签: android android-jobscheduler firebase-job-dispatcher

我是JobDispatcher的新手,所以我不确定我的问题是否有意义。

我有一个要求,我需要在后台定期运行一些任务(即使该应用未运行)。 任务没有在固定的时间间隔内执行。第一次执行任务时,我将了解下一个任务执行的时间表,因此,在第一次执行任务后,我应该将同一任务重新安排到以后的下一次,我将 完成任务后了解。它像这样继续下去。

这就像同步网络中的内容,网络数据会告诉您接下来何时同步。

所以,我的问题是

我应该为每个新任务每次创建一个新的工作吗?

我可以创建重复作业并继续更改时间间隔吗?

我该如何使用FireBaseJobDispatcher完全处理这种情况。

我之所以选择JobScheduler而不是FireBaseJobDispatcher,是因为我的应用还必须在Lollipop以下支持。

这是我使用FireBaseJobDispatcher尝试在给定时间执行任务的示例代码,并且工作正常。现在,我陷入了如何将其重新安排到下一个同步时间的问题。

        public class MyJobService extends JobService {
            private static final String TAG = "MyJobService";
            @Override
            public boolean onStartJob(final JobParameters job) {
                // Do some work here
                Log.d(TAG, "onStartJob: at "+Thread.currentThread().getName());
               new Thread(new Runnable() {
                   @Override
                   public void run() {
                       Log.d(TAG, "run: startign job ");
                       try {
                           Thread.sleep(2000);
                           // some syncing operation
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                       Log.d(TAG, "run: job done");
                       // here I need to reschedule the same job to a future time

                   }
               }).start();
                return false; 
            }

            @Override
            public boolean onStopJob(JobParameters job) {
                Log.d(TAG, "onStopJob: ");
                return false;
            }
        }

我正在这样的活动中设置工作

   // Create a new dispatcher using the Google Play driver.
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Bundle myExtrasBundle = new Bundle();
    myExtrasBundle.putString("some_key", "some_value");

    Job myJob = dispatcher.newJobBuilder()
            .setService(MyJobService.class)
            .setTag("syncservice")
            .setRecurring(true)
            .setLifetime(Lifetime.FOREVER)
            .setTrigger(Trigger.executionWindow(1*60*60 , 1*60*60)) // rigger after an hour
            // don't overwrite an existing job with the same tag
            .setReplaceCurrent(false)
            // retry with exponential backoff
            .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
            .setConstraints(
                    Constraint.ON_ANY_NETWORK
            )
            .setExtras(myExtrasBundle)
            .build();

    dispatcher.mustSchedule(myJob); 

谢谢!

1 个答案:

答案 0 :(得分:0)

@Override
public boolean onStopJob(JobParameters job) {
  Log.d(TAG, "onStopJob: ");
  if(rescheduleJob)
    return true; // reschedule job
  else
    return false; // cancel job
}

或者您可以尝试:

@Override
public boolean onStopJob(JobParameters job) {
  Log.d(TAG, "onStopJob: ");
  return rescheduleJob;
}