Jetpack系列之WorkManager(二)

120 阅读2分钟

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

WorkManager

WorkManager是一个抽象基类,实现类是WorkManagerImpl,主要功能就是对WorkRequest进行操作,如执行工作,观察工作,取消工作等等。

基本使用

// 普通调用
WorkManager.getInstance(this).enqueue(MqttConnectionWorker::class.java))
// 链式调用
WorkManager.getInstance(this)
	.beginWith(work1)//如果链中的任何工作失败或被取消,所有与其相关的工作将继承该状态,并且永远不会运行。
	.then(mutableListOf(work2, work3))
	.enqueue()

API使用

enqueueUniqueWork

该api用于创建唯一的一次性工作,将指定的工作添加到指定的命名空间中。

  • uniqueWorkName :该请求的唯一标识值,String类型。
  • existingWorkPolicy :冲突策略,该标识值的工作当前在执行中应该遵循什么策略。有四种策略①:REPLACE:新工作替代当前运行的工作。②:KEEP:等待没有该标识的工作在执行中才开始执行新工作。③:APPEND:将新工作作为该标识的叶节点。④:APPEND_OR_REPLACE
  • work:需要被执行的工作,这里可以接收单个工作,也可以是工作集合

enqueueUniquePeriodicWork

该api用于创建唯一的定期工作,将指定的工作添加到指定的命名空间中。参数列表和enqueueUniqueWork相同。

取消工作

  • cancelWorkById: 通过工作的id进行取消,已经在运行的可能会继续执行,id是每个WorkRequest在定义的时候就生成了唯一的id。
WorkManager.getInstance(this).cancelWorkById(myWorkId)
  • cancelAllWorkByTag:通过工作的tag进行取消,已经在运行的可能会继续执行
WorkManager.getInstance(this).cancelAllWorkByTag("workTag")
  • cancelUniqueWork:通过工作唯一的uniqueWorkName进行取消,已经在运行的可能会继续执行,work需要使用enqueueUniqueWork()方法进行提交。
WorkManager.getInstance(this).cancelUniqueWork("uniqueWorkName")
  • cancelAllWork:取消所有未进行的工作,已经在运行的可能会继续执行
WorkManager.getInstance(this).cancelAllWork()

getWorkInfoByIdLiveData

获取给定工作id的WorkInfo的LiveData

// work类
class MyWorker : Worker() {
    override fun doWork(): Result {
        //这里输出数据
        val outData: Data = Data.Builder().putString("OUT_DATA", "我是输出的数据").build()
        Result.success(outData)
    }
}

// 获取输出数据,该方法仅适用于OneTimeWorkRequest
fun observeMyWork() { WorkManager.getInstance(this).getWorkInfoByIdLiveData(myWorkId).observe(lifecycleOwner, workStatus -> {
        if (null != workStatus && workStatus.state.isFinished()) {
            // 接受输出数据
            val outData = workStatus.outputData.getString("OUT_DATA")
        }
    })
}