如何 运行 WorkManager 的工作每 5 秒重试一次
How to run WorkManager's work retry every 5 seconds
如何每 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()
}
}
您可以尝试手动安排您的任务,也许它可以帮助您实现目标。
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秒一次),有必要检查一下。
PeriodicWorkRequest
无法做到这一点。如果您查看正在使用的 PeriodicWorkRequest.Builder
构造函数的 documentation,您会看到它说的是第二个参数
The repeat interval must be greater than or equal to
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS.
而PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS
的值为900000,即等于15分钟。
重复间隔必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS(请参阅文档)。
周期性工作的最小间隔为 15 分钟
如何每 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()
}
}
您可以尝试手动安排您的任务,也许它可以帮助您实现目标。
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秒一次),有必要检查一下。
PeriodicWorkRequest
无法做到这一点。如果您查看正在使用的 PeriodicWorkRequest.Builder
构造函数的 documentation,您会看到它说的是第二个参数
The repeat interval must be greater than or equal to PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS.
而PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS
的值为900000,即等于15分钟。
重复间隔必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS(请参阅文档)。 周期性工作的最小间隔为 15 分钟