WorkManager笔记
基本知识
您需要了解以下几个 WorkManager 类:
Worker:此位置用于放置您希望在后台执行的实际工作的代码。您需要扩展此类并替换doWork()方法。WorkRequest:此类表示请求执行某些工作。您将在创建WorkRequest的过程中传入Worker。在创建WorkRequest时,您还可以指定Constraints等内容,例如运行Worker的时间。WorkManager:此类实质上可以调度WorkRequest并使其运行。它以一种在系统资源上分散负载的方式调度WorkRequest,同时遵循您指定的约束条件。
创建一个 WorkRequest,然后通过 WorkManager 将其加入队列。
- 输入和输出通过
Data对象传入和传出。Data对象是轻量化的键值对容器。它们用于存储少量可从WorkRequest传入和传出的数据。 - 链接的另一个简便特点是,一个
WorkRequest的输出会成为链中下一个WorkRequest的输入。在每个WorkRequest之间传递的输入和输出均显示为蓝色文本。
api
doWork() 中
通过调用 applicationContext 属性获取 Context
通过 val value = inputData.getString(key)
通过 val outputData = workDataOf(key to value)
Result.success(outputData)
创建WorkManager实例 private val workManager = WorkManager.getInstance(application)
如果不需要配置什么,直接 OneTimeWorkRequest.from(worker),
如果需要配置,使用构建者模式创建 OneTimeWorkRequestBuilder<Worker>()......build()//包括setInputData(一个Data的实例)
OneTimeWorkRequest: 仅执行一次的 WorkRequest。 PeriodicWorkRequest: 在一个周期中重复执行的 WorkRequest
如何链接request:
val continuation = workManager.beginWith(workA)
continuation.then(workB) // FYI, then() returns a new WorkContinuation instance
.then(workC)
.enqueue() // Enqueues the WorkContinuation which is a chain of work
确保工作链唯一: // REPLACE THIS CODE: // var continuation = workManager // .beginWith(OneTimeWorkRequest // .from(CleanupWorker::class.java)) // WITH var continuation = workManager .beginUniqueWork( IMAGE_MANIPULATION_WORK_NAME,//TAG字符串 确保工作链唯一 ExistingWorkPolicy.REPLACE, //一个枚举类, 定义出现相同TAG的时候该如何做 OneTimeWorkRequest.from(CleanupWorker::class.java) //开头的那个 )
取得work request三种状态的不同
- getWorkInfoByIdLiveData 对于一个确切的work request来获取info, 每一个work request实例id都会不一样
- getWorkInfosForUniqueWorkLiveData 当beginUniqueWork时,对于这条链上所有work request,返回一个list来包含
- getWorkInfosByTagLiveData 我们可以给一个work request打上一个Tag, 返回一个list包含所有使用这个Tag的不同work request实例的work info
而取消 work也有三种方式:根据特定id取消,根据Tag取消, 根据unique work chain name来取消一串work request。unique work chain name就是我们在定义beginUniqueWork时使用的TAG。

浙公网安备 33010602011771号