WorkManager使用入门

WorkManager提供了任务调度功能,我们可以对工作进行标记或命名。

我们用一个示例来演示如何使用WorkManager。本文使用Kotlin。

入门示例

gradle引入依赖

将以下依赖项添加到应用模块的build.gradle文件中

dependencies {
def work_version = "2.5.0" // (Java only)
implementation "androidx.work:work-runtime:$work_version" // Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version" // optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version" // optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version" // optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version" // optional - Multiprocess support
implementation "androidx.work:work-multiprocess:$work_version"
}

添加依赖项并同步 Gradle 后,下一步要定义一些工作。

定义工作

这里的工作为方便测试进行了简化。实际项目中请改为具体的业务代码。

新建UploadWorker类继承Worker类。需要2个参数context: Context, params: WorkerParameters

doWork()方法中是我们的具体任务,在WorkManager提供的后台线程上异步运行。

class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
for (i in 1..3) {
Log.d(TAG, "模拟执行任务 ${tags.first()} ${Thread.currentThread()}")
Thread.sleep(100) // 模拟耗时
}
return Result.success()
}
}

doWork()方法中我们打印当前线程信息。后面看看线程运行情况。

任务执行完毕,doWork()需要返回一个Result

  • Result.success():工作成功完成
  • Result.failure():工作失败
  • Result.retry():工作失败,应根据其重试政策在其他时间尝试

创建 WorkRequest

前面我们定义好了工作类UploadWorkerWorkManager可以调度工作,让工作运行起来。工作可以在某个时间段内定期运行,也可以只运行一次。

要运行工作,涉及到WorkRequest类和它的子类。

这里我们演示只运行1次的工作,使用OneTimeWorkRequest

创建workA,作为一个Activity里的变量

private val mWorkA = OneTimeWorkRequest.Builder(UploadWorker::class.java)
.addTag("workA").build()

创建workB

val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
.addTag("workB").build()

将WorkRequest提交给WorkManager

使用enqueue方法将WorkRequest提交给WorkManager。

获取WorkManager的实例用WorkManager.getInstance(applicationContext)方法。

mWorkA是变量

WorkManager.getInstance(applicationContext).enqueue(mWorkA)
// ...

workB是每次都新建一个对象,然后交给WorkManager去执行。

val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
.addTag("workB").build()
WorkManager.getInstance(applicationContext).enqueue(workB)

执行工作器的确切时间取决于WorkRequest中使用的约束和系统优化方式。

Google官方设计过WorkManager,能够在满足约束的情况下提供最佳行为。

运行测试

按钮A触发mWorkA,按钮B触发workB。分别点击按钮A/B

模拟执行任务 workA Thread[pool-2-thread-3,5,main]
模拟执行任务 workA Thread[pool-2-thread-3,5,main]
模拟执行任务 workA Thread[pool-2-thread-3,5,main]
点击按钮B Thread[main,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]

观察log发现,工作的doWork()方法在WorkManager提供的后台线程上异步运行。

主线程是[main,5,main],工作的线程是[pool-2-thread-3,5,main]

而在实际操作中发现,多次点击按钮A,mWorkA只会执行第一次。后面再点击按钮A,mWorkA也不会执行了。

小结

这个例子介绍了如何引入WorkManager,定义工作(任务),排队执行任务。

在使用方式上,让人联想到AsyncTask

其他参考

Android WorkManager使用入门的更多相关文章

  1. Android WorkManager 定时任务

    App有时可能需要定期运行某些工作.例如,可能要定期备份数据.上传信息到服务器,定期获取新的内容等等. 在app运行期间,我们使用Handler也可以完成定期的功能.在这里我们介绍WorkManage ...

  2. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  3. Android Studio单元测试入门

    Android Studio单元测试入门 通常在开发Android app的时候经常会写一些小函数并验证它是否运行正确,通常做法我们是把这个函数放到某个界面(Activity上)执行一下,运行整个工程 ...

  4. 下面就介绍下Android NDK的入门学习过程(转)

    为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库 ...

  5. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  6. 一看就懂的Android APP开发入门教程

    一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...

  7. (转)Android: NDK编程入门笔记

    转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...

  8. Android Wear 开发入门

    大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下An ...

  9. Android 学习资料入门到精通(PDF集合)共54本

    最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面 下面是网盘内容 14天学会安卓开发_(完整版).pdf Android 4  游戏高级编程 ...

随机推荐

  1. 常见链表操作-链表中环的检测(JAVA实现)

    问题如何检测一个单链表中是否有环,例如下图的例子. 解决思路1:快慢指针法这是最常见的方法.思路就是有两个指针P1和P2,同时从头结点开始往下遍历链表中的所有节点. P1是慢指针,一次遍历一个节点.P ...

  2. 深入理解 PHP7 中全新的 zval 容器和引用计数机制

    深入理解 PHP7 中全新的 zval 容器和引用计数机制 最近在查阅 PHP7 垃圾回收的资料的时候,网上的一些代码示例在本地环境下运行时出现了不同的结果,使我一度非常迷惑. 仔细一想不难发现问题所 ...

  3. vue(19)嵌套路由

    嵌套路由 有时候在路由中,主要的部分是相同的,但是下面可能是不同的.比如访问首页,里面有新闻类的/home/news,还有信息类的/home/message.这时候就需要使用到嵌套路由.项目结构如下: ...

  4. C语言共同体

    结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{    ...

  5. poj 折半搜索

    poj2549 Sumsets 题目链接: http://poj.org/problem?id=2549 题意:给你一个含有n(n<=1000)个数的数列,问这个数列中是否存在四个不同的数a,b ...

  6. 【译】.NET 对象分配工具

    随着 Visual Studio 16.10 的发布,性能分析器又有了一个新的分析引擎,.NET 对象分配工具是第一个加入的工具.这为该工具提供了一些新特性,并显著提高了 perf 性能.在你的 C# ...

  7. Spring总结之AOP

    一.Spring AOP简介(百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也是 Spring 框架中的一个重 ...

  8. HTML - form表单操作

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. UI自动化学习笔记- PO模型介绍和使用

    一.PO模型 1.PO介绍:page(页面) object(对象) 在自动化中,Selenium 自动化测试中有一个名字经常被提及 PageObject (思想与面向对象的特征相同),通常PO 模型可 ...

  10. eladmin-plus V2.0.0 发布,单表链式调用更丝滑

    一.项目简介 eladmin的mybatis-plus版本,单表使用链式调用,代码更简洁,调用更便捷.目前更新到2021年7月.项目基于 Spring Boot 2.4.2 . Mybatis-plu ...