【发布时间】: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