gpt4 book ai didi

android - WorkManager 通过标签获取下一次预定工作的时间

转载 作者:太空狗 更新时间:2023-10-29 13:46:01 28 4
gpt4 key购买 nike

我正在使用 WorkManager安排定期和一次性工作,我用相同的标签标记所有工作,以便我以后可以识别它:

workRequestBuilder.addTag("mywork");

随着各种工作项目在未来的不同时间排队,我想要一种查询工作队列以确定下一个工作计划何时为这个特定标签运行的方法(“我的作品”)。是的,我知道它不会很准确,并且会受到 Doze 等因素的影响,但在没有其他因素的情况下,知道何时可能运行工作仍然很有用。

我知道如何查询工作队列并按如下方式挑选出排队的工作项,但我不确定如何判断每个工作项计划运行的时间:

WorkManager workManager = WorkManager.getInstance();
ListenableFuture<List<WorkInfo>> workInfos = workManager.getWorkInfosByTag("mywork");

try {
List<WorkInfo> workInfoList = workInfos.get();
for (WorkInfo workInfo : workInfoList) {
WorkInfo.State state = workInfo.getState();
if (state == WorkInfo.State.ENQUEUED) {
UUID workerId = workInfo.getId();
Log.d(TAG, "found enqueued work with id " + workerId);
// BUT HOW DO I TELL WHAT TIME THIS WORK IS SCHEDULED TO RUN?
}
}
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}

最佳答案

我发现只有两种方法可以“解决”这个问题:

先决条件

不要使用周期性工作!始终使用 OneTimeWorkRequest 手动安排下一个周期性工作。

解决方法 1:

  • 在创建 WorkRequest 时,您将调用 setInitialDelay。排队请求后,您可以获得它的 id => 将此 id 与执行时间(可能还有策略信息和任何您想要的)一起保存在数据库中,然后您可以随时查询数据库并获取下一次执行时间
  • 当执行 WorkRequest 时,将其从数据库中删除,然后将下一个“周期性”任务手动安排为 OneTimeWorkRequest

解决方法 2:

  • 向所有 WorkRequests 添加 2 个自定义标签,例如“HasRunAt”和“RunAt:TIME_TO_RUN”
  • 然后获取所有 WorkInfos,如 WorkManager.getInstance().getWorkInfosByTag("HasRunAt") 并检查它们的标签并解析以“RanAt:”开头的标签。 ..

结论

没有解决方案是美丽的,我也希望有以下能力:

  • WorkInfo 中获取执行时间、策略等
  • WorkInfo 获取 InputData - 然后您可以将您想要访问的所有额外信息放入此数据并从那里获取它...<

关于android - WorkManager 通过标签获取下一次预定工作的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280660/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com