如何使用Android WorkManager按顺序执行动态长度的OneTimeWorkRequest列表
动态长度OneTimeWorkRequest顺序执行方案
WorkManager原生支持动态构造链式任务,不需要提前确定任务数量,通过迭代拼接WorkContinuation即可实现需求:
核心实现代码
基础遍历写法
// 先判空避免空指针异常 if (requestList.isNotEmpty()) { val workManager = WorkManager.getInstance(context) // 用第一个任务初始化任务链 var continuation = workManager.beginWith(requestList.first()) // 遍历剩余所有任务,逐个拼接至任务链末尾 for (index in 1 until requestList.size) { continuation = continuation.then(requestList[index]) } // 提交执行 continuation.enqueue() }
Kotlin函数式简化写法
用fold运算符可以更简洁的实现相同逻辑:
if (requestList.isNotEmpty()) { requestList.drop(1) .fold(WorkManager.getInstance(context).beginWith(requestList.first())) { prevContinuation, nextRequest -> prevContinuation.then(nextRequest) } .enqueue() }
注意事项
- 每个任务单独设置的
setInitialDelay会正常生效:延时是从该任务被前序任务触发后开始计时,不会和其他任务的延时冲突。 - 默认规则下如果前序任务返回
Result.failure(),后续所有任务会自动终止执行。如果需要任务失败也继续执行后续任务,可以在你的MyWorker中捕获所有异常,统一返回Result.success()即可。
可选替代方案
如果你的任务不需要在App退出/进程被杀后继续执行,仅需要前台存活时顺序运行,可以直接使用Kotlin协程实现,逻辑更简单:将每个任务的逻辑封装为suspend函数,按顺序调用即可,不需要依赖WorkManager。
内容的提问来源于stack exchange,提问作者John Octavious
相关产品推荐
相关产品推荐

