WorkManager - 如何从定期工作中获取 OutputData
WorkManager - How to get OutputData from a periodic work
我正在使用 PeriodicWorkRequest 每小时从 Internet 获取一些数据。我想用工作人员返回的结果更新我的应用程序的 UI。这是我现在的代码:
workManager.enqueueUniquePeriodicWork("name", ExistingPeriodicWorkPolicy.REPLACE, work)
workManager
.getWorkInfoByIdLiveData(work.id)
.observe(this, { workInfo ->
if (workInfo?.state == WorkInfo.State.SUCCEEDED) {
// it never arrives here for updating the UI
}
}
鉴于周期性工作的生命周期,状态 SUCCEEDED
永远不会达到,因为它在 RUNNING
和 ENQUEUED
之间反弹;在这两种状态下,Result.OutputData
对象是空的,所以我不能使用它。
该应用程序被认为不会一直保持打开状态,但当它打开时,它应该会显示从 worker 检索到的最后数据。
如何检索 doWork()
函数返回的结果的 OutputData?定期工作是否适合我的用例?
在您的情况下,一个选项是在每项工作完成后立即保留结果数据,这样您就可以从任何时候读取它。您有多种选择,例如喷气背包 DataStore.
一个更优雅的解决方案是观察 LiveData changes which you publish from the Work itself. See getWorkInfosByTagLiveData.
输出数据为空的原因,正如您已经发现的那样,是由于 PeriodicWorkRequest 的性质,它将 “链-> 执行” 没有最终状态的作业,导致下一个流程:
ENQUEUED >> RUNNING >> ENQUEUED >> RUNNING >> ...
相比之下,OneTimeWorkRequest 将与下一个一样,其中包括最终状态:
ENQUEUED >> RUNNING >> (SUCCEEDED or FAILED)
如 WorkInfo 文档中所述:
Note that output is only available for the terminal states
(WorkInfo.State.SUCCEEDED and WorkInfo.State.FAILED)
从逻辑上讲,PeriodicWorkRequests 的输出数据将始终为空,这是将所需数据保存在某处的唯一解决方法。
我正在使用 PeriodicWorkRequest 每小时从 Internet 获取一些数据。我想用工作人员返回的结果更新我的应用程序的 UI。这是我现在的代码:
workManager.enqueueUniquePeriodicWork("name", ExistingPeriodicWorkPolicy.REPLACE, work)
workManager
.getWorkInfoByIdLiveData(work.id)
.observe(this, { workInfo ->
if (workInfo?.state == WorkInfo.State.SUCCEEDED) {
// it never arrives here for updating the UI
}
}
鉴于周期性工作的生命周期,状态 SUCCEEDED
永远不会达到,因为它在 RUNNING
和 ENQUEUED
之间反弹;在这两种状态下,Result.OutputData
对象是空的,所以我不能使用它。
该应用程序被认为不会一直保持打开状态,但当它打开时,它应该会显示从 worker 检索到的最后数据。
如何检索 doWork()
函数返回的结果的 OutputData?定期工作是否适合我的用例?
在您的情况下,一个选项是在每项工作完成后立即保留结果数据,这样您就可以从任何时候读取它。您有多种选择,例如喷气背包 DataStore.
一个更优雅的解决方案是观察 LiveData changes which you publish from the Work itself. See getWorkInfosByTagLiveData.
输出数据为空的原因,正如您已经发现的那样,是由于 PeriodicWorkRequest 的性质,它将 “链-> 执行” 没有最终状态的作业,导致下一个流程:
ENQUEUED >> RUNNING >> ENQUEUED >> RUNNING >> ...
相比之下,OneTimeWorkRequest 将与下一个一样,其中包括最终状态:
ENQUEUED >> RUNNING >> (SUCCEEDED or FAILED)
如 WorkInfo 文档中所述:
Note that output is only available for the terminal states (WorkInfo.State.SUCCEEDED and WorkInfo.State.FAILED)
从逻辑上讲,PeriodicWorkRequests 的输出数据将始终为空,这是将所需数据保存在某处的唯一解决方法。