android开发,使用kotlin学习WorkManager
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
WorkMananger的简介
Google推出WorkManager组件WorkManager很适合用于处理一些要求定时执行的任务它可以根据操作系统的版本自动选择底层是使用AlarmManager实现还是JobScheduler实现从而降低了我们的使用成本。另外它还支持周期性任务链式任务处理等功能是一个非常强大的工具。
WorkManager的基本用法
在app/build.gradle文件添加依赖
implementation "androidx.work:work-runtime:2.7.1"
WorkManager的基本用法其实非常简单主要分为以下3步
- 定义一个后台任务并实现具体的任务逻辑。
- 配置该后台任务的运行条件和约束信息并构建后台任务请求。
- 将该后台任务请求传入WorkManager的enqueue()方法中系统会在合适的时间运行。
第一步要定义一个后台任务这里创建一个SimpleWorker类代码如下所示
class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
Log.d("SimpleWorker", "do work in SimpleWorker")
return Result.success()
}
}
第二步配置后台任务的运行条件和约束信息代码如下所示
//设置约束条件
//NetworkType.CONNECTED 最通用的连上网络
//NetworkType.UNMETERED WF
//NetworkType.METERED 流量4G
val constraints: Constraints =Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
.setConstraints(constraints)
.build()
最后一步将构建出的后台任务请求传入WorkManager的enqueue()方法中系统就会在合适的时间去运行了代码如下所示
WorkManager.getInstance(context).enqueue(request)
使用WorkManager处理复杂的任务
1让后台任务在指定的推迟时间后运行
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
.setInitialDelay(5,TimeUnit.MINUTES)
.build()
2给后台任务请求添加标签
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
...
.addTag("simple")
.build()
3通过标签来取消后台任务请求
WorkManager.getInstance(this).cancelAllWorkByTag("simple")
4即使没有标签也可以通过id来取消后台任务请求
WorkManager.getInstance(this).cancelAllWorkById(request.id)
(5) 一次性取消所有后台任务请求
WorkManager.getInstance(this).cancelAllWork()
6如果后台任务的doWork方法中返回了Result.retry()那么是可以结合setBackoffCriteria方法来重新执行任务的。
setBackoffCriteria:第一个参数用于指定如果任务失败再次执行失败下次重试的时间应该以什么样的形式延迟可选值有两种1.LINEAR代表下次重试时间以线性的方式延迟。2.EXPONENTIAL,代表下次重试时间以指数的方式延迟。第二个参数和第三个参数用于指定在多久之后重新执行任务时间最短不能少于10秒钟。
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
...
.setBackoffCriteria(BackoffPolicy.LINEAR,10,TimeUnit.SECONDS)
.build()
7doWork方法中返回Result.success()和Result.failure又有什么作用这两个返回值其实就是用于通知任务运行结果的我们可以使用如下代码对后台任务的运行结果进行监听
WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.id).observer(this){workInfo->
if(workInfo.state==WorkInfo.State.SUCCEEDED){
Log.d("MainActivity","do work succeeded")
}else if(workInfo.state==WorkInfo.State.FAILED){
Log.d("MainActivity","do work failed")
}
}
链式任务
假如这里定义了3个独立的后台任务同步数据压缩数据和上传数据。现在我们想要实现先同步再压缩最后上传的功能就可以借助链式任务来实现。
val sync=...
val compress=...
val upload=...
WorkManager.getInstance(this)
.beginWith(sync)
.then(compress)
.then(upload)
.enqueue()