持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
WorkManager 是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是永久性的工作。由于大多数后台处理操作都是通过持久性工作完成的,因此 WorkManager 是适用于后台处理操作的主要推荐 API。
特点
- 可以按照执行周期合理安排
work的执行。立即执行、长时间执行、延期执行。 - 可以按照执行条件约束
work的执行,如:网络状况、电量状况等。 - 可以按照业务需求灵活配置
work重试机制。退避时间和退避政策。 - 可以按照业务的关联,给
work设置相关任务链。
工作状态
一次性工作
任务提交之后进入ENQUEUED状态;满足工作的 Constraints 和初始延迟计时要求后立即运行进入RUNNING状态;根据工作结果会进入SUCCESS、FAILURE状态;如果执行了重试会RETRY状态;随后进入ENQUEUED状态,当工作被取消了则进入 CANCELLED;
重复工作
成功和失败状态仅适用于一次性工作和链式工作。定期工作只有一个终止状态 CANCELLED。这是因为定期工作永远不会结束。每次运行后,无论结果如何,系统都会重新对其进行调度。
基本使用
// work类
class MyWorker : Worker() {
override fun doWork(): Worker.WorkerResult {
//这里执行work任务
...
// 这里提供三个返回
// a. WorkerResult.SUCCESS 任务执行成功
// b. WorkerResult.FAILURE 任务执行失败
// c. WorkerResult.RETRY 任务执行重试
return Worker.WorkerResult.SUCCESS
}
}
// 调用工作
fun myWorkerRunner() {
myWork = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
WorkManager.getInstance(this).enqueue(myWork)
}
// 停止工作
fun myWorkerStopper() {
myWorkId = myWork.id
WorkManager.getInstance(this).cancelWorkById(myWorkId)
}
// 观察工作
fun observeMyWork() { WorkManager.getInstance(this).getWorkInfoByIdLiveData(myWorkId).observe(lifecycleOwner, workStatus -> {
if (null != workStatus && workStatus.state.isFinished()) {
// 观察结果
}
})
}
好处
- 自行处理与不同操作系统版本的兼容性
- 遵循最佳实践来照顾系统健康
- 支持一次性和周期性异步任务
- 支持带有输入/输出的链式任务
- 允许设置任务运行时间的约束
- 保证任务执行,即使应用程序或设备重新启动