WorkManager#beginUniqueWork
方法似乎非常适合此任务,其中uniqueWorkName
将是某个对话ID,并且ExistingWorkPolicy.APPEND
将作为工作策略以保持已安排工作的顺序。到目前为止,在我的应用程序中,只要每个工作部件返回
Result.SUCCESS
,则任何未来预定的工作都将按预期执行。但是,如果一个特定的消息以致命的方式无法发送并返回Result.FAILURE
,则具有相同会话ID的所有未来工作似乎都无法到达我的Worker#doWork()
实现。经过研究
EnqueueRunnable
类的源代码,这似乎是一个非常刻意的选择。我真正理解不了的是为什么会这样?如果uniqueWorkName
失败,那么这个名称在应用程序的整个生命周期中就变得无法使用(即使杀死应用程序也是如此)。此外,我想知道是否有任何好的解决方案,或者是否知道这在WorkManager
的未来版本中会发生改变。到目前为止,我能想到的最好的方法是返回Result.SUCCESS
,但将我的自定义失败状态编码到输出Data
中,以使任何工作的观察者都知道它已经失败。然而这有点笨拙,并且对于代码的未来维护者不够明显(并且在查看给定的Work
日志时可能会有些混淆)。
也许我的独特工作意图完全错误,还有更好的解决方案。如有任何想法,不胜感激,谢谢!
Result.SUCCESS
并将一些失败代码放在输出Data
中,但现在我真的不想再调用Result.FAILURE
了,否则这个对话就变得无法使用,这对我来说似乎很奇怪! - Dean