Выполнять задачу каждую секунду с помощью Work Manager API

Диспетчер работ - это новый API, и я пытаюсь выполнять задачу каждую секунду, но это не работает.

Это мой рабочий класс

class TestingWorker : Worker(){
    override fun doWork(): Result {
        Log.i("CheckWorker","Result here")
        return Result.SUCCESS
    }
}

и вот где я это назвал.

 val recurringWork: PeriodicWorkRequest = PeriodicWorkRequest.Builder(TestingWorker::class.java, 1, TimeUnit.SECONDS).build()
 WorkManager.getInstance()?.enqueue(recurringWork)

person Chivorn    schedule 06.07.2018    source источник
comment
он работает только один раз при запуске приложения. но я хочу, чтобы он выполнялся каждую секунду, братан.   -  person Chivorn    schedule 06.07.2018
comment
@VicJordan: ты понял?   -  person Chivorn    schedule 06.07.2018
comment
Я предполагаю, что минимальный временной интервал (и временной интервал по умолчанию) составляет 15 минут. Более того, не рекомендуется запускать задачу bg каждую секунду, так как это может неэффективно расходовать заряд батареи.   -  person Yaswant Narayan    schedule 06.07.2018
comment
Ты прав, братан. Попробовав побольше узнать об этом, я получил ответ.   -  person Chivorn    schedule 06.07.2018
comment
ребята, вы можете посмотреть мой вопрос? пожалуйста :)   -  person b devloper    schedule 15.11.2018


Ответы (2)


Это не работает, потому что минимальный интервал между двумя периодическими рабочими запросами составляет 15 минут, что определяется MIN_PERIODIC_INTERVAL_MILLIS.

На основе документация:

Создает PeriodicWorkRequest для периодического выполнения один раз за каждый период интервала. PeriodicWorkRequest гарантированно будет запущен ровно один раз в течение этого интервала. Значение intervalMillis должно быть больше или равно PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS. Он может выполняться немедленно, в конце периода или в любое время между ними, если в это время выполняются другие условия.

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

person Sagar    schedule 06.07.2018
comment
Я понял. В любом случае это должно отображаться как предупреждающее сообщение, чтобы сообщить нам об этом. - person Chivorn; 06.07.2018
comment
@Chivorn да! Однако это явно указывается в документе. - person Sagar; 06.07.2018
comment
Я проверил исходный код и нашел, как показано ниже: public void setPeriodic (long intervalDuration) {if (intervalDuration ‹MIN_PERIODIC_INTERVAL_MILLIS) {Log.w (TAG, String.format (Interval duration меньше минимально допустимого значения; изменено на% s , MIN_PERIODIC_INTERVAL_MILLIS)); intervalDuration = MIN_PERIODIC_INTERVAL_MILLIS; } setPeriodic (intervalDuration, intervalDuration); } Так что меньше 15 млн у нас не получится. Спасибо, бро. - person Chivorn; 06.07.2018
comment
@Chivorn, без проблем. Не забудьте пометить ответ как принятый, если он был полезен, чтобы другие тоже могли извлечь выгоду и наслаждаться кодированием :-) - person Sagar; 06.07.2018

WorkManager не предназначен для выполнения задач каждую секунду, так как у него есть два варианта создания запроса на работу, а именно:

  • PeriodicWorkRequest - запускает повторяющуюся задачу каждые 15 минут, даже если мы изменим временной интервал на anyhwere ‹15 минут, по умолчанию она будет выполняться только в течение 15 минут.
  • OneTimeWorkRequest - запускается один раз

WorkManager поставит в очередь рабочие запросы, вызовет соответствующие классы Worker для запуска задачи, где каждый рабочий класс переопределяет doWork(), в котором определена фактическая задача.

Этот метод работает в фоновом потоке и работает в течение 10 минут, после чего рабочий процесс останавливается.

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

Если вы хотите запускать фоновые задачи в течение более длительных периодов времени, лучше избегать этого.

person Ajay Deepak    schedule 26.08.2019