【问题标题】:Android WorkManager retrieve all requestsAndroid WorkManager 检索所有请求
【发布时间】:2022-02-14 23:27:51
【问题描述】:

我使用 WorkManager 而不是 AlarmManager,并且我想在运行时更新请求,因此我需要检索该请求。我该怎么做?

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

workManager.enqueue(request);

【问题讨论】:

    标签: android android-workmanager


    【解决方案1】:

    您可以使用getWorkInfoByIdLiveDatagetWorkInfoByTagLiveData。 WorkManager 为每个 enqueue() 添加一个隐式标记,这是类的简单名称。所以你可以这样做:

    workManager.getWorkInfosByTagLiveData(TripWorker.class.getName())
    

    【讨论】:

    • 在发布此问题之前,我准备使用此行!它返回LiveData<List<WorkInfo>>!它包含WorkInfo 对象而不是WorkRequest 对象
    【解决方案2】:

    您不能修改现有的 WorkRequest。

    您可以使用 WorkManager 的 unique work 并将修改后的 WorkRequest 入队以替换现有的:

    1. 使用enqueueUniqueWork 而不是enqueue
    2. 当您需要修改 WorkRequest 时,创建一个新的并使用 UniqueWorkRequest 将其排入队列,使用相同的唯一名称和 REPLACE 策略。

    请记住,您的 Worker 可能会在您替换它时运行。您需要使用isStopped 方法和实现onStopped() 回调仔细处理您的Worker 中的停工(停工是合作的,因此您需要添加一些代码,如guide 中所述)。

    【讨论】:

    • thanx bro 现在可以正常工作了,但我想知道为什么我无法检索请求并对其进行编辑,阻止的原因是什么?
    • 主要问题是您的 WorkRequest 可能已经注册到 JobScheduler,这实际上需要删除以前的 Job 并注册一个正确处理所有极端情况的新 Job,通常取决于特定的工作你安排...
    【解决方案3】:

    不幸的是,从 v2.7.1 开始似乎无法获得已提交的 WorkRequest


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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多