【问题标题】:workmanager repeating doWork() multiple timesworkmanager 多次重复 doWork()
【发布时间】:2022-06-13 06:42:05
【问题描述】:

这个问题已经以不同的形式被问过很多次了,但我没有得到正确的答案,想知道它是否可能不是一个 android 错误。

设置 WorkManager 后,doWork() 会随机调用,有时会快速连续调用 10 次以上。

  • 它在我的 MainApplication 中只被调用一次(*见下文)
  • 如果它被意外调用,我会尝试清除并重新启动它
  • 我已经卸载并重新安装了应用程序
  • 我在调用 WorkManager 之前清除了所有实例
  • 我尝试使用唯一标签创建它

预期行为是每 10-15 分钟调用一次

请查看以下详细信息: 使用 Android studio Bumblebee 2021.1.1 Patch 2 在 LG K22 上实施

Gradle 实现:

implementation 'androidx.work:work-runtime-ktx:2.7.1'

MainActivity 代码:

    WorkManager.getInstance(this).cancelAllWorkByTag("scanDevices")
    val myMonitorWorkerRequest = PeriodicWorkRequest.Builder(myMonitorWorker::class.java,
        15, TimeUnit.MINUTES,5, TimeUnit.MINUTES).build()

    WorkManager.getInstance(this)
        .enqueueUniquePeriodicWork(
            "scanDevices",
            ExistingPeriodicWorkPolicy.KEEP,
            myMonitorWorkerRequest)
  • 注意:ExistingPeriodicWorkPolicy.REPLACE 不会改变此处的行为

原来的工人阶级:

  override fun doWork(): Result {
    try{
        runNotificationService()
        return Result.success()
    }
    catch (e:Exception){
        return Result.failure()
    }
}

当前工人阶级:

  override fun doWork(): Result {
    try{
        val timeNow = System.currentTimeMillis()
        if(timeNow < lastTime+600000){
            WorkManager.getInstance(theContext).cancelAllWorkByTag("scanDevices")
            val myMonitorWorkerRequest = PeriodicWorkRequest.Builder(myMonitorWorker::class.java,
                15, TimeUnit.MINUTES,5, TimeUnit.MINUTES).build()

            WorkManager.getInstance(theContext)
                .enqueueUniquePeriodicWork(
                    "scanDevices",
                    ExistingPeriodicWorkPolicy.KEEP,
                    myMonitorWorkerRequest)
        }
        else{
            runNotificationService()
            lastTime = timeNow
        }
        return Result.success()
    }
    catch (e:Exception){
        return Result.failure()
    }
}

上面的代码还不是防弹的,因为工人类有时会被如此快速地连续调用,以至于多个(实例/线程(我认为))同时启动并且全局变量的更新没有生效在另一个实例开始之前。它确实显着减少了调用次数,但只有一两个额外的实例通过。

具体来说,我的问题是,有没有人知道我做的任何事情是错误的,或者是否有针对正在创建的多个工作实例/线程的已知错误报告?

查看这些我尝试过但不起作用的类似参考:

WorkManager executing enqueueUniquePeriodicWork() multiple times at once?

doWork() for WorkManager called multiple times for OneTimeWorkRequest

*App Inspection 显示 20 个实例在 android studio 上排队

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: android android-workmanager


【解决方案1】:

我不知道确切的原因,但我今天遇到了同样的问题,这非常令人沮丧。所以我决定卸载该应用程序,它神奇地起作用了。 希望你也是这样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多