小言_互联网的博客

android开发,使用kotlin学习WorkManager

292人阅读  评论(0)

WorkMananger的简介


Google推出WorkManager组件,WorkManager很适合用于处理一些要求定时执行的任务,它可以根据操作系统的版本自动选择底层是使用AlarmManager实现还是JobScheduler实现,从而降低了我们的使用成本。另外,它还支持周期性任务,链式任务处理等功能,是一个非常强大的工具。

WorkManager的基本用法


在app/build.gradle文件添加依赖

 implementation "androidx.work:work-runtime:2.7.1"

WorkManager的基本用法其实非常简单,主要分为以下3步:

  • 定义一个后台任务,并实现具体的任务逻辑。
  • 配置该后台任务的运行条件和约束信息,并构建后台任务请求。
  • 将该后台任务请求传入WorkManager的enqueue()方法中,系统会在合适的时间运行。

第一步要定义一个后台任务,这里创建一个SimpleWorker类,代码如下所示:


  
  1. class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
  2. override fun doWork(): Result {
  3. Log.d( "SimpleWorker", "do work in SimpleWorker")
  4. return Result.success()
  5. }
  6. }

第二步,配置后台任务的运行条件和约束信息,代码如下所示:


  
  1. //设置约束条件
  2. //NetworkType.CONNECTED 最通用的连上网络
  3. //NetworkType.UNMETERED WF
  4. //NetworkType.METERED 流量,4G
  5. val constraints: Constraints =Constraints. Builder()
  6. . setRequiredNetworkType(NetworkType.CONNECTED)
  7. . build()
  8. val request=OneTimeWorkRequest. Builder(SimpleWorker::class.java)
  9. . setConstraints(constraints)
  10. . build()

 最后一步,将构建出的后台任务请求传入WorkManager的enqueue()方法中,系统就会在合适的时间去运行了,代码如下所示:

WorkManager.getInstance(context).enqueue(request)

使用WorkManager处理复杂的任务


(1)让后台任务在指定的推迟时间后运行


  
  1. val request=OneTimeWorkRequest.Builder(SimpleWorker:: class.java)
  2. .setInitialDelay( 5,TimeUnit. MINUTES)
  3. .build()

(2)给后台任务请求添加标签


  
  1. val request=OneTimeWorkRequest.Builder(SimpleWorker:: class.java)
  2. ...
  3. .addTag( "simple")
  4. .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秒钟。


  
  1. val request=OneTimeWorkRequest.Builder(SimpleWorker:: class.java)
  2. ...
  3. .setBackoffCriteria(BackoffPolicy. LINEAR, 10,TimeUnit. SECONDS)
  4. .build()

(7)doWork方法中返回Result.success()和Result.failure()又有什么作用?这两个返回值其实就是用于通知任务运行结果的,我们可以使用如下代码对后台任务的运行结果进行监听:


  
  1. WorkManager .getInstance(this) .getWorkInfoByIdLiveData(request.id) .observer(this){workInfo->
  2. if(workInfo.state==WorkInfo.State.SUCCEEDED){
  3. Log .d("MainActivity","do work succeeded")
  4. }else if(workInfo.state==WorkInfo.State.FAILED){
  5. Log .d("MainActivity","do work failed")
  6. }
  7. }

链式任务


假如这里定义了3个独立的后台任务:同步数据,压缩数据和上传数据。现在我们想要实现先同步,再压缩,最后上传的功能,就可以借助链式任务来实现。


  
  1. val sync=...
  2. val compress=...
  3. val upload=...
  4. WorkManager.getInstance( this)
  5. .beginWith(sync)
  6. .then(compress)
  7. .then(upload)
  8. .enqueue()


转载:https://blog.csdn.net/weixin_63357306/article/details/127195294
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场