【问题标题】:Firebase JobDispatcher : How to reschedule the same job?Firebase JobDispatcher:如何重新安排相同的工作?
【发布时间】:2018-10-15 15:01:06
【问题描述】:

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

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

这就像从网络同步一些东西,网络数据会告诉你下次什么时候同步。

所以,我的问题是

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

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

如何使用 FireBaseJobDispatcher 准确处理这种情况。

我之所以选择 FireBaseJobDispatcher 而不是 JobScheduler,是因为我的应用还必须支持 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); 

提前致谢!

【问题讨论】:

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


    【解决方案1】:
    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2016-11-15
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多