如何每隔5秒重新运行 WorkManager 的工作重试

3
如何每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
文档声称backoffDelay将被夹在WorkRequest#MIN_BACKOFF_MILLIS和WorkRequest#MAX_BACKOFF_MILLIS之间MIN_BACKOFF_MILLIS恰好为10秒。因此,我认为不可能有5秒的重试周期。 - art
@art 是的,也许有其他官方方法来运行具有此间隔的定期作业? 或者完全不可能做到这一点,因为间隔很小。 也许有一种方法可以消除BackoffPolicty的线性增长? - Kyryl Zotov
3个回答

2
这是不可能的,使用PeriodicWorkRequest无法实现。如果您查看所使用的PeriodicWorkRequest.Builder构造函数的文档,您会发现它关于第二个参数的说明如下:

重复间隔必须大于或等于PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS。

PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS的值为900000,意味着它等于15分钟。

如果我不想每5秒“调度”一次,而是在内部工作失败时每5秒“重试”一次怎么办? - Kyryl Zotov

2
你可以尝试手动安排任务,也许这有助于实现你的目标。
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秒一次),有必要进行检查。


你检查过这个解决方案吗? - Atamyrat Babayev

1
重复间隔必须大于或等于PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS(请参阅文档)。定期工作的最小间隔为15分钟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接