Jetpack系列之WorkManager(一)

205 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

WorkManager 是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是永久性的工作。由于大多数后台处理操作都是通过持久性工作完成的,因此 WorkManager 是适用于后台处理操作的主要推荐 API。

特点

  1. 可以按照执行周期合理安排work的执行。立即执行、长时间执行、延期执行。
  2. 可以按照执行条件约束work的执行,如:网络状况、电量状况等。
  3. 可以按照业务需求灵活配置work重试机制。退避时间和退避政策。
  4. 可以按照业务的关联,给work设置相关任务链。

工作状态

一次性工作

任务提交之后进入ENQUEUED状态;满足工作的 Constraints 和初始延迟计时要求后立即运行进入RUNNING状态;根据工作结果会进入SUCCESSFAILURE状态;如果执行了重试会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()) {
            // 观察结果
        }
    })
}

好处

  1. 自行处理与不同操作系统版本的兼容性
  2. 遵循最佳实践来照顾系统健康
  3. 支持一次性和周期性异步任务
  4. 支持带有输入/输出的链式任务
  5. 允许设置任务运行时间的约束
  6. 保证任务执行,即使应用程序或设备重新启动