android - WorkManager - 如何从定期工作中获取 OutputData
问题描述
我正在使用 PeriodicWorkRequest 每小时从 Internet 获取一些数据。我想使用工作人员返回的 Result 更新我的应用程序的 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
对象是空的,所以我不能使用它。
该应用程序被认为不会一直保持打开状态,但是当它打开时,它应该显示从工作人员检索到的最后数据。
如何检索doWork()
函数返回的 Result 的 OutputData?定期工作是否适合我的用例?
解决方案
在您的情况下,一个选项是在每项工作完成时保留结果数据,以便您可以从任何时候读取它。您有几个选项,例如 jetpack DataStore。
更优雅的解决方案是观察您从作品本身发布的LiveData更改。请参阅getWorkInfosByTagLiveData。
正如您已经发现的那样,输出数据为空的原因是由于 PeriodicWorkRequest 的性质,它将“链->执行”没有最终状态的作业,从而导致下一个流程:
ENQUEUED >> RUNNING >> ENQUEUED >> RUNNING >> ...
相比之下,OneTimeWorkRequest 将如下所示,其中包括最终状态:
ENQUEUED >> RUNNING >> (SUCCEEDED or FAILED)
如WorkInfo文档中所述:
请注意,输出仅适用于终端状态(WorkInfo.State.SUCCEEDED 和 WorkInfo.State.FAILED)
从逻辑上讲,PeriodicWorkRequests 的输出数据将始终为空,这是将所需数据保存在某处的唯一解决方法。
推荐阅读
- postfix-mta - Postfix 尝试从 root@info@domain.com 发送邮件
- reactjs - 如何使用 Jest 和测试库更改组件状态?
- angular - Angular:如何为 Angular 应用程序中的功能创建测试模块?
- python - 为什么python脚本线程不起作用?
- java - 解析由键“1”、“2”给出的隐式 JSON 列表
- android - Android中AutocompleteSupportFragment的样式文本颜色和提示颜色
- python - 如何从 PDB 文件中提取链 ID?
- linux - 如何显示给定目录中字符串中单词的基本名称、路径和出现次数?
- javascript - 查找具有相同类的最近元素
- database - 您的实时数据库有不安全的规则