持续创作,加速成长!这是我参与「掘金日新计划 · 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")
}
})
}