And*_*ono 3 android android-workmanager
我正在使用PeriodicWorkRequest 每小时从互联网获取一些数据。我想用工作人员返回的结果更新我的应用程序的 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
}
}
Run Code Online (Sandbox Code Playgroud)
给定周期性工作的生命周期,状态SUCCEEDED永远不会达到,因为它在RUNNING和之间跳跃ENQUEUED;在这两种状态下,Result.OutputData对象是空的,所以我不能使用它。
该应用程序被认为不会一直保持打开状态,但当它打开时,它应该显示从工作人员检索到的最后数据。
如何检索函数返回的结果的 OutputData doWork()?定期工作是适合我的用例的工具吗?
在您的情况下,一个选择是在每项工作完成时保留结果数据,以便您可以从任何点读取它。您有多种选择,例如 jetpack DataStore。
一个更优雅的解决方案是观察您从工作本身发布的LiveData更改。请参阅getWorkInfosByTagLiveData。
正如您已经发现的,输出数据为空的原因是由于PeriodicWorkRequest的性质,它将“链接->执行”没有最终状态的作业,从而导致下一个流程:
ENQUEUED >> RUNNING >> ENQUEUED >> RUNNING >> ...
Run Code Online (Sandbox Code Playgroud)
相反,OneTimeWorkRequest 将如下所示,其中包括最终状态:
ENQUEUED >> RUNNING >> (SUCCEEDED or FAILED)
Run Code Online (Sandbox Code Playgroud)
正如WorkInfo文档中所述:
请注意,输出仅适用于终端状态(WorkInfo.State.SUCCEEDED 和 WorkInfo.State.FAILED)
从逻辑上讲,PeriodicWorkRequests 的输出数据将始终为空,这是将所需数据保留在某处的唯一解决方法。
| 归档时间: |
|
| 查看次数: |
1616 次 |
| 最近记录: |