Подтвердить что ты не робот

Запланировать повторную работу с помощью диспетчера работ

Я пытаюсь разместить местоположение устройства android на сервере каждые 10 минут. Я использую диспетчер работы firebase для этого.

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job myJob = dispatcher.newJobBuilder()
    .setService(UpdateLocationService.class)
    .setRecurring(true)
    .setTrigger(Trigger.executionWindow(10, 20))
    .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
    .setTag("location-update-job")
    .setLifetime(Lifetime.FOREVER)
    .build();
dispatcher.mustSchedule(myJob);

UpdateLocationService получает местоположение и отправляет сервер.

Моя проблема: вещи в основном работают нормально. Дело только в том, что задания планируются с разницей в 4 м, 6 м, 7 м, 8 м, 10 м, 16 м, 23 м...

Может кто-нибудь, пожалуйста, помогите мне понять, что происходит.

Обновление: я хочу, чтобы местоположение было раз в 10-20 минут. В приведенном выше коде значение слишком мало для целей тестирования

4b9b3361

Ответ 1

Также:

Trigger.executionWindow(windowStart, windowEnd)

ожидает windowStart и windowEnd в секундах. Согласно вашему требованию, вы хотите, чтобы в окне было 10 минут. Поэтому вы должны использовать что-то вроде:

Trigger.executionWindow(10*60, 20*60)

Ответ 2

ExecutionWindow указывает приблизительное время. Это не гарантировало, что работа будет работать в данном окне. Если он пропустит окно, задание будет запущено в самое ближайшее время в идеальных обстоятельствах. Для повторяющихся заданий после завершения задания следующая работа будет вычислять время окна выполнения с момента последнего выполнения задания.

ССЫЛКА

ExecutionWindow представляет триггер Job, который становится подходящим      текущее прошедшее время превышает запланированное время + {@code windowStart}       стоимость. Оболочке планировщика рекомендуется использовать значение windowEnd как      сигнал о том, что задание должно выполняться, но это не принудительное поведение.

Ответ 3

Есть несколько причин, почему это может произойти. Во-первых, ваша работа возвращает false в onStopJob()? Из документов

@Override
public boolean onStopJob(JobParameters job) {
    return false; // Answers the question: "Should this job be retried?"
}

Если задание необходимо повторить, будет применено отсрочка. Объедините это с тем фактом, что вы хотите, чтобы он запускался снова каждые 10-20 секунд, вы можете получить результаты, которые вы испытываете.

Вы не задали никаких ограничений для задания, что также повлияет на его запуск. например

.setConstraints( // only run on an unmetered network Constraint.ON_UNMETERED_NETWORK, // only run when the device is charging Constraint.DEVICE_CHARGING )

Кроме того, я бы не использовал запланированное задание для того, что вы делаете. Обратитесь к клиенту API Google, который предлагает периодические обновления из поставщика плавного доступа.

Вы можете реализовать обратный вызов для своего Сервиса или Действия, например

public class MainActivity extends ActionBarActivity implements
        ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
    ...
    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
        updateUI();
    }

    private void updateUI() {
        mLatitudeTextView.setText(String.valueOf(mCurrentLocation.getLatitude()));
        mLongitudeTextView.setText(String.valueOf(mCurrentLocation.getLongitude()));
        mLastUpdateTimeTextView.setText(mLastUpdateTime);
    }
}

Ознакомьтесь с полным документом здесь, но я считаю, что у вас будет более последовательный опыт работы с услугами, посвященными тому, чего вы пытаетесь достичь.

https://developer.android.com/training/location/receive-location-updates.html