我认为存在三个问题。
enqueue
myWork
1) 每次访问WorkManager
实例时,您都会创建一个新的周期性工作。
试试看,doWork()
你的方法中的逻辑MyWorker.class
第一次运行一次,第二次运行两次。您很可能向工作管理器添加了 11 个作品,这就是您上次检查时它运行 11 次的原因。如果您创建新作品并将其添加到工作管理器中,则myWork
运行次数会增加。
与 Job Scheduler 类似,您必须在将 Work 添加到 Work Manager 之前检查 Work 是否存在。
示例代码:
final WorkManager workManager = WorkManager.getInstance();
final LiveData<List<WorkStatus>> statusesByTag = workManager
.getStatusesByTag(TAG_PERIODIC_WORK_REQUEST);
statusesByTag.observe(this, workStatuses -> {
if (workStatuses == null || workStatuses.size() == 0) {
Log.d(TAG, "Queuing the Periodic Work");
// Create a periodic request
final PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES)
.addTag(TAG_PERIODIC_WORK_REQUEST)
.build();
// Queue the work
workManager.enqueue(periodicWorkRequest);
} else {
Log.d(TAG, "Work Status Size: " + workStatuses.size());
for (int i = 0; i < workStatuses.size(); i++) {
Log.d(TAG, "Work Status Id: " + workStatuses.get(i).getId());
Log.d(TAG, "Work Status State: " + workStatuses.get(i).getState());
}
Log.d(TAG, "Periodic Work already exists");
}
});
在上面的示例中,我使用一个唯一的标签TAG_PERIODIC_WORK_REQUEST
来标识我的定期工作,并在创建它之前检查它是否存在。
2)当应用程序被杀死时,您的工作可能无法运行。
你测试的是什么牌子的?是小米吗?您是否在多个其他品牌上进行过测试并得到相同的结果?
是否处于打盹模式?当您设置 24 小时时间时,您如何验证工作没有运行?
Work Manager 提供向后兼容性,但您仍然需要处理设备特定的逻辑。在小米设备上,类似于 Job Scheduler(或 Firebase Job Dispatcher 或 Alarm),当应用程序被杀死时,周期性工作停止。
3)我只是认为PeriodicWorkRequest
提供的WorkManager
错误。
自上周开始以来,我一直在多台设备上对其进行测试。我在第一次启动应用程序时创建了一个作品,并且三天没有打开它。第一次运行一次,触发第二次同步时运行两次,在这之间,它增加到 13 次,下降到 1 次,4 次等等。
在另一个测试中,我在第一次安装期间使用以下代码创建了一个作品,并从第二次安装中删除了代码。在这个测试过程中,即使工作成功完成,工作每次都运行,杀死它后打开应用程序。
final PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES)
.addTag("periodic-work-request")
.build();
// Queue the work
WorkManager.getInstance().enqueue(periodicWorkRequest);
我明白这一点,因为它仍处于 alpha 阶段。我认为您不应该在生产中使用它。