簡體   English   中英

如何每 5 秒運行一次 WorkManager 的工作重試

[英]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構造函數的文檔,您會看到它說明了第二個參數

重復間隔必須大於或等於 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS。

PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS值為900000,即等於15分鍾。

重復間隔必須大於或等於 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS(參見文檔)。 周期性工作的最小間隔為 15 分鍾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM