WorkManager 重复执行 doWork() 多次。

5

这个问题以不同的形式被问过很多次,但我无法正确解决它,我在想这是否可能是一个安卓系统的漏洞。

在设置了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不会改变此处的行为

原始Worker类:

  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执行enqueueUniquePeriodicWork()多次同时出现? OneTimeWorkRequest的doWork()被调用多次的WorkManager *应用检查在Android Studio上显示有20个实例排队。

请澄清您的具体问题或提供额外的细节,以准确突出您所需的内容。目前的描述不够清晰,很难确定您在询问什么。 - Community
经典的Google程序员。难道他们不能让某些东西正常工作吗?就一次呗?啊...他们的安卓框架中有数百个漏洞。每天都会遇到至少一个该死的问题。我发誓,每天都是如此。拜托了,Google,醒醒吧! - qkx
我也遇到了同样的问题。你的安卓版本是多少,@Assay?很不幸,我的是安卓5(相当老了,我知道)。希望这在更新的安卓版本中得到修复。 - Caelis
@Caelis,手机上的Android版本是10。 - Assay
1个回答

2

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


1
我之前尝试过重新安装,但不幸的是对我没有起作用。 - Assay
令人惊讶的是,这对我在模拟器上运行的应用程序起作用了,我卸载了它,它就不再每15分钟触发一次了。非常感谢Haitham。 - Tonnie

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