【问题标题】:How to update timeInterval for PeriodicWorkRequest after doWork() call如何在 doWork() 调用后更新 PeriodicWorkRequest 的 timeInterval
【发布时间】:2021-07-08 09:25:48
【问题描述】:

我是 android 工作管理器的新手,我想在收到服务器响应后更新 PeriodicWorkRequest 的 timeInterval。这是我尝试更新 timeInterval 的示例代码。但它会进入调用 doWork() 函数的无限循环。请告诉我哪里错了。

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

private val min = 0
private val max = 100
var randomNumber = 0
var context: Context

init {
    Log.d(TAG, "Constructor invoked")
    this.context = context
    Log.d(TAG, "" + workerParams.id.toString())
}

private fun startRandomNumberGenerator() {
    Log.d(TAG, "startRandomNumberGenerator: isStopped: $isStopped")
    var i = 0
    while (i < 5) {
        try {
            Thread.sleep(1000)
            randomNumber = Random().nextInt(max) + min
            Log.d(
                TAG,
                "Thread Id: " + Thread.currentThread().id + " Random Number: " + randomNumber
            )
            i++
        } catch (e: Exception) {

        }

        if (i == 5) {
            callUpdateSyncTime()
        }
    }

}

private fun callUpdateSyncTime() {
    Log.d(TAG, "callUpdateSyncTime() called")

    val periodicWork =
        PeriodicWorkRequest.Builder(RandomNumberGenerator::class.java, 20, TimeUnit.MINUTES)
            .build()

    WorkManager.getInstance(context)
        .enqueueUniquePeriodicWork(
            "work_manager_random",
            ExistingPeriodicWorkPolicy.REPLACE,
            periodicWork
        )
}

companion object {
    const val TAG = "WorkManager"
}

override fun doWork(): Result {
    startRandomNumberGenerator()
    return Result.success()
}

override fun onStopped() {
    Log.d(TAG, "onStopped() called")
    super.onStopped()
}

}

这是我如何从 MainActivity 排队的代码

val workRequestRandomNumber: PeriodicWorkRequest =
        PeriodicWorkRequestBuilder<RandomNumberGenerator>(
            15,
            TimeUnit.MINUTES
        ).build()
    workManager.enqueueUniquePeriodicWork(
        "work_manager_random",
        ExistingPeriodicWorkPolicy.KEEP,
        workRequestRandomNumber
    )

【问题讨论】:

    标签: android android-service androidx android-jetpack android-workmanager


    【解决方案1】:

    当您对 PeriodicWorkRequest 进行排队时,如果您不使用 setInitialDelay() 添加初始延迟,它将立即执行。

    鉴于您每次完成时都会重新安排您的工作人员,我建议您使用 OneTimeWorkRequest,而不是重复的,初始延迟:

    val workRequestRandomNumber =
            OneTimeWorkRequestBuilder<RandomNumberGenerator>()
                .setInitialDelay(
                    15,
                    TimeUnit.MINUTES)
                .addTag("work_manager_random")
                .build()
    
    workManager.enqueue(workRequestRandomNumber)
    

    就像现在一样,WorkManager 正在向您忽略的工作人员发送取消消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多