Как запустить работу WorkManager каждые 5 секунд - PullRequest
0 голосов
/ 19 февраля 2020

Как повторить работу каждые 5 секунд? А если все прошло успешно, то отмените его?

С приведенным ниже решением оно запускается каждые 10 секунд + Линейный рост времени.

// todo: schedule, and invoke worker every 5 seconds
// todo: if the work is done and there is no more work in queue - cancel worker.

fun scheduleBatchUpload(uniqueWorkName: String) {
    val logBuilder = PeriodicWorkRequest.Builder(StreamLogWorker::class.java, 5, TimeUnit.SECONDS)

    logBuilder.setBackoffCriteria(BackoffPolicy.LINEAR, 5000, TimeUnit.MILLISECONDS) // Custom retry not working

    WorkManager.getInstance().enqueueUniquePeriodicWork(uniqueWorkName, ExistingPeriodicWorkPolicy.REPLACE, logBuilder.build())
}


class StreamLogWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {

    override fun doWork(): Result {
        Log.e("!!!!!!!!!!", "doWork")
        return Result.retry()
    }
}

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Это невозможно с PeriodicWorkRequest. если вы посмотрите на документацию используемого вами конструктора PeriodicWorkRequest.Builder, вы увидите, что он говорит следующее о втором параметре

Интервал повторения должен быть больше или равно PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS.

. Значение PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS равно 900000, что означает, что оно равно 15 минутам.

1 голос
/ 19 февраля 2020

Вы можете попытаться запланировать свою задачу вручную, возможно, это поможет достичь вашей цели.

private fun WorkManager.launchFrequentTask() {
    val request = OneTimeWorkRequestBuilder<StreamLogWorker>()
            .setInitialDelay(5, TimeUnit.SECONDS)
            .build()
    enqueueUniqueWork(UNIQUE_WORK_NAME, ExistingWorkPolicy.APPEND, request)
}

class StreamLogWorker(private val context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {

    override fun doWork(): Result {
        try {
            // TODO doWork
        } catch (th: Throwable) {
            // log error
        }
        WorkManager.getInstance(context).launchFrequentTask()
        return Result.success()
    }
}

Не уверен, что это действительно работает так, как вы хотите (каждые 5 секунд), необходимо проверить .

...