我的应用程序中安排了两个定期工作人员,其中一名工作人员在 24 小时后重复,另一名工作人员在 15 分钟后重复。
最初,在全新安装时,一切按预期工作,但几天后,我在 2 台设备(共 5 台)上遇到了问题。
24 小时工作人员被正确触发,但 15 分钟工作人员根本没有触发。我已经24小时监视这件事了。
我通过听诊器查看了workmanager的数据库,看到了一些24小时工人的条目和0个15分钟工人的条目。我正在寻找WorkSpec
table.
我通过 Android studio 进行调试,并在使用查询 WorkManager 之后getWorkInfosByTag()
我得到了 15 分钟工作人员的 80 个对象的列表,其中 79 个对象在CANCELED
状态,其中一个处于ENQUEUED
state.
显然,被取消的工人没有添加到数据库中?
我没有从谷歌找到任何解释工人被取消的场景的文档。
我在用1.0.0-beta03
工作运行时的版本。
另外,我不会杀死该应用程序或做任何有趣的事情。该应用程序在后台运行并且没有被杀死。
设备为小米A2(Android 9)、红米Note 4(Android 7)。
我需要了解为什么工作人员被取消,是否有更好的方法来调试它?任何指示都会有帮助并点赞!
Thanks.
Edit1:发布代码来安排两个工作人员。
24小时定期工作人员:
public static synchronized void scheduleWork() {
checkPreviousWorkerStatus();
if (isWorking()) {
Log.i("AppDataCleanupWorker", "Did not schedule data cleanup work; already running.");
return;
}
if (lastWorkId != null) {
WorkManager.getInstance().cancelAllWorkByTag("AppDataCleanupWorker");
lastWorkId = null;
}
Constraints constraints = new Constraints.Builder()
.setRequiresCharging(true)
.build();
PeriodicWorkRequest.Builder builder = new PeriodicWorkRequest
.Builder(AppDataCleanupWorker.class, 24, TimeUnit.HOURS)
.addTag("AppDataCleanupWorker")
.setConstraints(constraints);
PeriodicWorkRequest workRequest = builder.build();
lastWorkId = workRequest.getId();
WorkManager.getInstance().enqueue(workRequest);
List<WorkInfo> workInfos = WorkManager.getInstance()
.getWorkInfosByTagLiveData("AppDataCleanupWorker")
.getValue();
if (workInfos != null && workInfos.size() > 1) {
throw new RuntimeException("Multiple workers scheduled. Only one schedule is expected.");
}
}
15分钟周期性工作人员:
public static synchronized void scheduleWork() {
checkPreviousWorkerStatus();
if (isWorking) {
Log.i("ImageUploadWorker", "Did not schedule image upload work; already running.");
return;
}
if (lastWorkId != null) {
WorkManager.getInstance().cancelAllWorkByTag("ImageUploadWorker");
lastWorkId = null;
}
Constraints constraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest.Builder builder =
new PeriodicWorkRequest.Builder(ImageUploadWorker.class, 15,
TimeUnit.MINUTES)
.addTag("ImageUploadWorker")
.setConstraints(constraints);
PeriodicWorkRequest workRequest = builder.build();
lastWorkId = workRequest.getId();
WorkManager.getInstance().enqueue(workRequest);
List<WorkInfo> workInfos = WorkManager.getInstance()
.getWorkInfosByTagLiveData("ImageUploadWorker").getValue();
if (workInfos != null && workInfos.size() > 1) {
throw new RuntimeException("Multiple workers scheduled. Only one schedule is expected.");
}
}
注意:设备已连接互联网且网速良好。