Firebase JobDispatcher: Как перенести ту же работу? - PullRequest
0 голосов
/ 15 октября 2018

Я новичок в 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); 

Заранее спасибо!

1 Ответ

0 голосов
/ 26 декабря 2018
@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;
}
...