这个问题以不同的形式被问过很多次,但我无法正确解决它,我在想这是否可能是一个安卓系统的漏洞。
在设置了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个实例排队。