WorkManager学习指南

44

基本知识

您需要了解以下几个 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。