android开发,使用kotlin学习WorkManager

简介: android开发,使用kotlin学习WorkManager

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()

(7)doWork方法中返回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()
目录
相关文章
|
7天前
|
Java Kotlin
Kotlin学习教程(七)
《Kotlin学习教程(七)》主要介绍了Lambda表达式,这是一种匿名函数,广泛用于简化代码。文章通过与Java 8 Lambda表达式的对比,展示了Kotlin中Lambda的基本语法、参数声明、函数体定义及如何作为参数传递。示例包括按钮事件处理和字符串比较,突出了Lambda表达式的简洁性和实用性。
22 4
|
9天前
|
Java Kotlin 索引
Kotlin学习教程(三)
Kotlin学习教程(三)
14 4
|
9天前
|
Java Kotlin
Kotlin学习教程(二)
Kotlin学习教程(二)
25 4
|
9天前
|
安全 Java 编译器
Kotlin学习教程(一)
Kotlin学习教程(一)
13 4
|
8天前
|
存储 Java API
Kotlin学习教程(六)
《Kotlin学习教程(六)》介绍了Kotlin中的注解、反射、扩展函数及属性等内容。注解用于添加元数据,反射支持运行时自省,扩展则允许为现有类添加新功能,无需修改原类。本文还详细解释了静态扩展的使用方法,展示了如何通过companion object定义静态部分,并对其进行扩展。
10 2
|
8天前
|
存储 设计模式 JSON
Kotlin学习教程(五)
《Kotlin学习教程(五)》介绍了Kotlin中的泛型、嵌套类、内部类、匿名内部类、枚举、密封类、异常处理、对象、单例、对象表达式、伴生对象、委托等高级特性。具体内容包括泛型的定义和类型擦除、嵌套类和内部类的区别、匿名内部类的创建、枚举类的使用、密封类的声明和用途、异常处理机制、对象和单例的实现、对象表达式的应用、伴生对象的作用以及类委托和属性委托的使用方法。通过这些内容,读者可以深入理解Kotlin的高级特性和设计模式。
11 1
|
10天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
19 1
|
12天前
|
JavaScript Java Kotlin
Kotlin开发笔记 - 常量与变量
Kotlin开发笔记 - 常量与变量
23 2
|
13天前
|
JavaScript Java Kotlin
|
12天前
|
IDE 开发工具 Kotlin
Kotlin开发笔记 - 参数与异常
本教程详细讲解Kotlin语法,适合深入学习。若需快速掌握,可参考“简洁”系列教程。内容涵盖具名参数、变长参数、默认参数、多返回值及异常处理等核心概念,助你高效编程。
11 1

相关实验场景

更多