Android WorkManager检索所有请求

3

我使用WorkManager代替AlarmManager,并且我想在运行时更新请求,因此需要检索该请求。我该如何做到这一点?

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(TripWorker.class)
                           .setInputData(dataBuilder.build())
                           .setInitialDelay(milliseconds, TimeUnit.MILLISECONDS)
                           .addTag("Tag")
                           .build();

workManager.enqueue(request);
3个回答

4
你可以使用getWorkInfoByIdLiveDatagetWorkInfoByTagLiveData。WorkManager会为每个enqueue()添加一个隐式标签,该标签是类的简单名称。因此,你可以这样做:
workManager.getWorkInfosByTagLiveData(TripWorker.class.getName())

在发布这个问题之前,我尝试使用了这行代码!它返回了 LiveData<List<WorkInfo>>!它包含 WorkInfo 对象,而不是 WorkRequest 对象。 - ahmed mohammed
嗨@Rahul,这与这个问题无关。 我有另一个问题。https://dev59.com/XMz6oIgBc1ULPQZF3L-g我想知道何时使用ForceStoppableRunnable类。类顶部的描述不是很清楚。请帮助我理解。 - Vikas Pandey

0

你不能修改现有的WorkRequest。

你可以使用WorkManager的unique work,并将修改后的WorkRequest加入队列,替换掉现有的工作:

  1. 使用enqueueUniqueWork而不是使用enqueue
  2. 当你需要修改WorkRequest时,创建一个新的WorkRequest,并使用相同的唯一名称,以REPLACE策略将其加入UniqueWorkRequest队列。
请注意,当您替换 Worker 时,它可能正在运行。您需要仔细处理 Worker 中的停止(停止是协作的,因此您需要添加一些代码,如 指南 中所述),使用 isStopped 方法并实现 onStopped() 回调函数。

谢谢兄弟,现在它可以工作了,但我想知道为什么我无法检索请求并编辑它,有什么阻止它的原因? - ahmed mohammed
主要问题是您的WorkRequest可能已经注册到JobScheduler,这实际上需要删除先前的Job并使用正确处理所有边角情况注册一个新的Job,通常取决于您安排的特定工作... - pfmaggi

-1

很遗憾,截至v2.7.1,似乎无法获取已提交的WorkRequest


对于想要查看传递给工作请求的输入数据的人:

您可以自己保存工作请求的输入数据,例如在 Room 表(如果使用 Room)或其他任何地方,并使用从 WorkManager.enqueue 返回的 ID 作为键。

然后,通过获取 workInfos 列表,您可以按其 ID 查询数据库表(或其他存储)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接