| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Jetpack WorkManager 看这一篇就够了~ -> 正文阅读 |
|
[移动开发]Jetpack WorkManager 看这一篇就够了~ |
前言最近有读者反馈,在我的新书《Android Jetpack 开发:原理解析与应用实战》中并没有提及到WorkManager,这是因为目前这个东西在国内并不是很好用。最近因为工作需要正好研究了下,也作为补充章节分享给读者。 什么是WorkManager按照官方描述,WorkManager 是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是持久性的工作。由于大多数后台处理操作都是通过持久性工作完成的,因此 WorkManager 是适用于后台处理操作的主要推荐 API。 任务类型WorkManager任务类型分为立即运行、长期运行和延期执行,使用方式与周期关系如下所示:
接下来来看具体的使用方法。 入门使用添加依赖库本文代码使用Kotlin编写,所以这里仅引入Kotlin相关的库即可,在build.gradle中添加代码如下所示:
如果使用的是Java语言该如何引用呢?听我的,放弃吧~ 定义工作Worker这里我们以上传日志文件任务为例,新建UploadLogWorker类,继承自Worker,代码如下所示:
继承自Worker的类需要重写doWork方法,我们可以在这个方法中执行具体的任务,这里为了有演示结果打印出线程的名称。 Result用于返回任务的执行结果Result.success表示执行成功;Result.failure、Result.retry则分别表示执行失败和失败后尝试重试。 创建任务请求WorkRequest这里我们创建一个一次性的执行任务,代码如下所示:
将任务提交系统创建好任务之后,就可以将任务提交系统,执行请求,代码如下所示:
运行App,运行结果如下图所示。 为任务传递参数许多时候我们在执行任务的时候是需要参数的,比如上传日志文件我们要知道日志文件的路径或者其他参数,我们怎么样将参数传递给Worker呢? 我们可以通过WorkRequest的setInputData方法来设置参数,代码如下所示:
这里我们传递了文件路径filePath和文件名fileName,在Worker通过getInputData方法接受,比如我们在doWork中接受参数并打印。代码如下所示:
运行程序,打印如下图所示。 这样我们就完成了一个最简单的WorkManager使用案例。接着我们来进一步的探索。 执行加急工作你所需要知道的从 WorkManager 2.7 开始,我们可以调用setExpedited方法来告诉系统,我这个任务是加急任务,请尽快执行。修改代码如下所示:
setExpedited方法中的OutOfQuotaPolicy参数有两个枚举值,含义如下所示。
所以我们这里声明为RUN_AS_NON_EXPEDITED_WORK_REQUEST即可。再次运行程序。 OK,完美运行??? 不过我的手机是Android 12的,为了确保没问题,我们必须在Android 11 或低版本上执行一次。没崩溃,但是任务却没执行,我们看到了错误日志如下图所示。 Emm.. 一堆乱七八糟的,关键信息在这句话
从官方我们获取到了这些信息:在 Android 12 之前,工作器中的 如果未能实现对应的 了解到了这些,那我们就来实现
再次在Android11 上运行程序,发现打印出了日志,并显示了一个任务通知,如下图所示。 这一点是在执行加急工作时所必须要注意的。 协程工作CoroutineWorker1、将继承类修改为CoroutineWorker 2、实现getForegroundInfo方法,内容与上getForegroundInfo一致 定时任务PeriodicWorkRequest在3.2中我们定义了一次性任务OneTimeWorkRequestBuilder,现在我们将上传日志的这个任务修改为定时任务,代码如下所示:
这里指定了,定时任务的周期是15分钟一次,可以定义的最短重复间隔就是 15 分钟,这一点开发者在测试的时候需要注意,不能傻傻的等着...,这里我就傻傻的等了15分钟,确保定时任务是可以执行的。 工作约束、延迟执行和重试策略工作约束很多情况下,我们需要为任务添加工作约束,比如上传日志的任务肯定是在有网络的条件下进行的,当前支持的约束条件如下所示。
比如我们现在为一次性任务添加约束为在连接wifi的情况下执行,首先用Constraints构建一个约束实例可以将多个约束条件放在一起。代码如下所示:
这里设置为仅在充电的时候执行。接着为任务构建器添加约束。
这样一来任务就会在仅充电的时候执行了。 延迟执行延迟执行适用于一次性任务和定时任务,但应用在定时任务事时对第一次执行有效,为啥呢?因为是定时任务呀~ 我们为一次性任务设置延迟时间为5秒钟,代码如下所示:
运行程序,可以看到5秒钟后,程序才打印了日志,这里就不演示了。 重试策略在3.2中定义Work中我们提到了Result.retry可以让任务重试,我们也可以自定义任务的重试策略和退避政策,我们通过具体的例子来解释。
最短退避延迟时间设置为允许的最小值,即 10 秒。由于政策为 LINEAR,每次尝试重试时,重试间隔都会增加约 10 秒。例如,第一次运行以 Result.retry() 结束并在 10 秒后重试;然后,如果工作在后续尝试后继续返回 Result.retry(),那么接下来会在 20 秒、30 秒、40 秒后重试,以此类推。 打印日志如下图所示。 我们可以看到,第一次任务失败后延迟了10秒重新执行,第二次延迟了20秒,第三次延迟了40秒... 观察工作执行结果在任务完成后,我可能需要进行更新UI或者业务逻辑操作。我们可以通过注册监听器来观察 WorkInfo 的变化,以根据ID查询WorkInfo状态为例,代码如下所示:
除了getWorkInfoByIdLiveData之外还有根据tag、name等查询的转化方法,这里读者可自行查看API。 运行程序,结果如下图所示。 类似的我们还可以通过cancelWorkById等方法来取消任务的执行。这里不做演示了。此外还有一些其他的特性感兴趣的读者可以自行实践。 总结特性及注意事项
问题
这里遇到了这样一个问题,在这个文章发布的时候,我还不知道该如何解决。希望知道的大佬指教指教~ 如果你想学习Jetpack更多精彩内容,欢迎购买我的新书《Android Jetpack开发:原理解析与应用实战》 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 5:01:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |